Hystrix面试 - 基于 Hystrix 线程池技术实现资源隔离
Hystrix面试 - 基于 Hystrix 线程池技术实现资源隔离
上一讲提到,如果从 Nginx 开始,缓存都失效了,Nginx 会直接通过缓存服务调用商品服务获取最新商品数据(我们基于电商项目做个讨论),有可能出现调用延时而把缓存服务资源耗尽的情况。这里,我们就来说说,怎么通过 Hystrix 线程池技术实现资源隔离。
资源隔离,就是说,你如果要把对某一个依赖服务的所有调用请求,全部隔离在同一份资源池内,不会去用其它资源了,这就叫资源隔离。哪怕对这个依赖服务,比如说商品服务,现在同时发起的调用量已经到了 1000,但是线程池内就 10 个线程,最多就只会用这 10 个线程去执行,不会说,对商品服务的请求,因为接口调用延时,将 tomcat 内部所有的线程资源全部耗尽。
Hystrix 进行资源隔离,其实是提供了一个抽象,叫做 command。这也是 Hystrix 最最基本的资源隔离技术。
利用 HystrixCommand 获取单条数据
我们通过将调用商品服务的操作封装在 HystrixCommand 中,限定一个 key,比如下面的 GetProductInfoCommandGroup
,在这里我们可以简单认为这是一个线程池,每次调用商品服务,就只会用该线程池中的资源,不会再去用其它线程资源了。
public class GetProductInfoCommand extends HystrixCommand<ProductInfo> {private Long productId;public GetProductInfoCommand(Long productId) {super(HystrixCommandGroupKey.Factory.asKey("GetProductInfoCommandGroup"));this.productId = productId;}@Overrideprotected ProductInfo run() {String url = "http://localhost:8081/getProductInfo?productId=" + productId;// 调用商品服务接口String response = HttpClientUtils.sendGetRequest(url);return JSONObject.parseObject(response, ProductInfo.class);}
}
我们在缓存服务接口中,根据 productId 创建 command 并执行,获取到商品数据。
@RequestMapping("/getProductInfo")
@ResponseBody
public String getProductInfo(Long productId) {HystrixCommand<ProductInfo> getProductInfoCommand = new GetProductInfoCommand(productId);// 通过command执行,获取最新商品数据ProductInfo productInfo = getProductInfoCommand.execute();System.out.println(productInfo);return "success";
}
上面执行的是 execute() 方法,其实是同步的。也可以对 command 调用 queue() 方法,它仅仅是将 command 放入线程池的一个等待队列,就立即返回,拿到一个 Future 对象,后面可以继续做其它一些事情,然后过一段时间对 Future 调用 get() 方法获取数据。这是异步的。
利用 HystrixObservableCommand 批量获取数据
只要是获取商品数据,全部都绑定到同一个线程池里面去,我们通过 HystrixObservableCommand 的一个线程去执行,而在这个线程里面,批量把多个 productId 的 productInfo 拉回来。
public class GetProductInfosCommand extends HystrixObservableCommand<ProductInfo> {private String[] productIds;public GetProductInfosCommand(String[] productIds) {// 还是绑定在同一个线程池super(HystrixCommandGroupKey.Factory.asKey("GetProductInfoGroup"));this.productIds = productIds;}@Overrideprotected Observable<ProductInfo> construct() {return Observable.unsafeCreate((Observable.OnSubscribe<ProductInfo>) subscriber -> {for (String productId : productIds) {// 批量获取商品数据String url = "http://localhost:8081/getProductInfo?productId=" + productId;String response = HttpClientUtils.sendGetRequest(url);ProductInfo productInfo = JSONObject.parseObject(response, ProductInfo.class);subscriber.onNext(productInfo);}subscriber.onCompleted();}).subscribeOn(Schedulers.io());}
}
在缓存服务接口中,根据传来的 id 列表,比如是以 ,
分隔的 id 串,通过上面的 HystrixObservableCommand,执行 Hystrix 的一些 API 方法,获取到所有商品数据。
public String getProductInfos(String productIds) {String[] productIdArray = productIds.split(",");HystrixObservableCommand<ProductInfo> getProductInfosCommand = new GetProductInfosCommand(productIdArray);Observable<ProductInfo> observable = getProductInfosCommand.observe();observable.subscribe(new Observer<ProductInfo>() {@Overridepublic void onCompleted() {System.out.println("获取完了所有的商品数据");}@Overridepublic void onError(Throwable e) {e.printStackTrace();}/*** 获取完一条数据,就回调一次这个方法* @param productInfo*/@Overridepublic void onNext(ProductInfo productInfo) {System.out.println(productInfo);}});return "success";
}
我们回过头来,看看 Hystrix 线程池技术是如何实现资源隔离的。
从 Nginx 开始,缓存都失效了,那么 Nginx 通过缓存服务去调用商品服务。缓存服务默认的线程大小是 10 个,最多就只有 10 个线程去调用商品服务的接口。即使商品服务接口故障了,最多就只有 10 个线程会 hang 死在调用商品服务接口的路上,缓存服务的 tomcat 内其它的线程还是可以用来调用其它的服务,干其它的事情。
转载来源:https://github.com/doocs/advanced-java/blob/master/docs/high-availability/hystrix-thread-pool-isolation.md
Hystrix面试 - 基于 Hystrix 线程池技术实现资源隔离相关推荐
- Hystrix面试 - 基于 Hystrix 信号量机制实现资源隔离
Hystrix面试 - 基于 Hystrix 信号量机制实现资源隔离 Hystrix 里面核心的一项功能,其实就是所谓的资源隔离,要解决的最最核心的问题,就是将多个依赖服务的调用分别隔离到各自的资源池 ...
- 基于SmartThreadPool线程池技术实现多任务批量处理
一.多线程技术应用场景介绍 本期同样带给大家分享的是阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何采用基于开源组件SmartThreadPool线程池技术实现多任务批量处理.在工作中您是否 ...
- C# SmartThreadPool线程池技术实现多任务批量处理
一.多线程技术应用场景介绍 本期同样带给大家分享的是阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何采用基于开源组件SmartThreadPool线程池技术实现多任务批量处理.在工作中您是否 ...
- Hystrix面试 - 深入 Hystrix 线程池隔离与接口限流
Hystrix面试 - 深入 Hystrix 线程池隔离与接口限流 前面讲了 Hystrix 的 request cache 请求缓存.fallback 优雅降级.circuit breaker 断路 ...
- Hystrix面试 - 基于 request cache 请求缓存技术优化批量商品数据查询接口
Hystrix面试 - 基于 request cache 请求缓存技术优化批量商品数据查询接口 Hystrix command 执行时 8 大步骤第三步,就是检查 Request cache 是否有缓 ...
- Hystrix面试 - 基于 timeout 机制为服务接口调用超时提供安全保护
Hystrix面试 - 基于 timeout 机制为服务接口调用超时提供安全保护 一般来说,在调用依赖服务的接口的时候,比较常见的一个问题就是超时.超时是在一个复杂的分布式系统中,导致系统不稳定,或者 ...
- Hystrix面试 - 基于本地缓存的 fallback 降级机制
Hystrix面试 - 基于本地缓存的 fallback 降级机制 Hystrix 出现以下四种情况,都会去调用 fallback 降级机制: 断路器处于打开的状态. 资源池已满(线程池+队列 / 信 ...
- Hystrix面试 - 深入 Hystrix 执行时内部原理
Hystrix面试 - 深入 Hystrix 执行时内部原理 前面我们了解了 Hystrix 最基本的支持高可用的技术:资源隔离 + 限流. 创建 command: 执行这个 command: 配置这 ...
- Hystrix面试 - 用 Hystrix 构建高可用服务架构
Hystrix面试 - 用 Hystrix 构建高可用服务架构 Hystrix 是什么? 在分布式系统中,每个服务都可能会调用很多其他服务,被调用的那些服务就是依赖服务,有的时候某些依赖服务出现故障也 ...
最新文章
- [JZOJ P1291] [DP]添加括号
- Java最新版本中另外发现五项漏洞
- python补课费用_学习python阶段小总结
- C++ Programmer's Cookbook C++基础和C++高级
- CTR预估中的特征选择
- 一天一小步_我学C#入门精典_第八天
- Spring框架----IOC的概念和作用之程序的耦合和解耦
- LeetCode刷题(21)
- 虚拟IP技术-VIP 与 负载均衡
- arduino mega针脚_Arduino MEGA中文数据手册
- 【数学模拟卷总结】2023李林六套卷数学二第一套
- win7修复计算机卡了,Win7修复漏洞补丁后系统变卡的原因和解决方法
- 基于FBX SDK的FBX模型解析与加载 -(四)
- 王者勋章服务器维护中,【维护】4月1日官方维护公告(抢鲜服)
- c++怎么判断系统是64位还是32位
- linux飞腾cpu,基于飞腾CPU+银河麒麟操作系统编译安装tensorflow
- 【关于微信小程序登录信息】 微信即将不再支持wx.getUserInfo() 授权弹出框 2018年5月12日
- 修改ntoskrnl.exe的方法
- android setting之Settings.system设置
- DSO Framer ActiveX 控件
热门文章
- 用Vim编程——配置与技巧
- Moodle: 登记学生,检测学生是否存在在课程 Check if user is enrolled or enroll a user in course...
- Python_mlab_3D作图/gif
- 马拉车(manacher)算法——最长回文(hdu3068)
- 在CentOS 7上安装并配置Python 3.6环境
- 一个账号,防止多设备登陆
- 华为机试——简单密码
- 《C和指针》——字符数组和字符串常量的区别
- QuickSort 优化后的快速排序算法
- LeetCode 35. Search Insert Position