From b2f9168a571eaa6a9e1d0f03eb9362f4abd00694 Mon Sep 17 00:00:00 2001 From: yanglbme Date: Wed, 26 Dec 2018 20:40:31 +0800 Subject: [PATCH] docs: add hystrix-thread-pool-isolation.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hystrix 线程池技术实现资源隔离 Redis 小修改 --- README.md | 1 + .../hystrix-thread-pool-isolation.md | 116 ++++++++++++++++++ .../img/hystrix-thread-pool-isolation.png | Bin 0 -> 12597 bytes docs/high-concurrency/redis-consistence.md | 2 +- .../redis-expiration-policies-and-lru.md | 6 +- img/hystrix-thread-pool-isolation.png | Bin 0 -> 12597 bytes 6 files changed, 121 insertions(+), 4 deletions(-) create mode 100644 docs/high-availability/hystrix-thread-pool-isolation.md create mode 100644 docs/high-availability/img/hystrix-thread-pool-isolation.png create mode 100644 img/hystrix-thread-pool-isolation.png diff --git a/README.md b/README.md index 940788b..3c86cce 100644 --- a/README.md +++ b/README.md @@ -82,6 +82,7 @@ ## 高可用架构 - [Hystrix 介绍](/docs/high-availability/hystrix-introduction.md) - [电商网站详情页系统架构](/docs/high-availability/e-commerce-website-detail-page-architecture.md) +- [Hystrix 线程池技术实现资源隔离](/docs/high-availability/hystrix-thread-pool-isolation.md) ### 高可用系统 - 如何设计一个高可用系统? diff --git a/docs/high-availability/hystrix-thread-pool-isolation.md b/docs/high-availability/hystrix-thread-pool-isolation.md new file mode 100644 index 0000000..84a7357 --- /dev/null +++ b/docs/high-availability/hystrix-thread-pool-isolation.md @@ -0,0 +1,116 @@ +## 基于 Hystrix 线程池技术实现资源隔离 + +上一讲提到,如果从 Nginx 开始,缓存都失效了,Nginx 会直接通过缓存服务调用商品服务获取最新商品数据(我们基于电商项目做个讨论),有可能出现调用延时而把缓存服务资源耗尽的情况。这里,我们就来说说,怎么通过 Hystrix 线程池技术实现资源隔离。 + +资源隔离,就是说,你如果要把对某一个依赖服务的所有调用请求,全部隔离在同一份资源池内,不会去用其它资源了,这就叫资源隔离。哪怕对这个依赖服务,比如说商品服务,现在同时发起的调用量已经到了 1000,但是线程池内就 10 个线程,最多就只会用这 10 个线程去执行,不会说,对商品服务的请求,因为接口调用延时,将 tomcat 内部所有的线程资源全部耗尽。 + +Hystrix 进行资源隔离,其实是提供了一个抽象,叫做 command。这也是 Hystrix 最最基本的资源隔离技术。 + +### 利用 HystrixCommand 获取单条数据 +我们通过将调用商品服务的操作封装在 HystrixCommand 中,限定一个 key,比如下面的 `GetProductInfoCommandGroup`,在这里我们可以简单认为这是一个线程池,每次调用商品服务,就只会用该线程池中的资源,不会再去用其它线程资源了。 + +```java +public class GetProductInfoCommand extends HystrixCommand { + + private Long productId; + + public GetProductInfoCommand(Long productId) { + super(HystrixCommandGroupKey.Factory.asKey("GetProductInfoCommandGroup")); + this.productId = productId; + } + + @Override + protected ProductInfo run() { + String url = "http://localhost:8081/getProductInfo?productId=" + productId; + // 调用商品服务接口 + String response = HttpClientUtils.sendGetRequest(url); + return JSONObject.parseObject(response, ProductInfo.class); + } +} +``` + +我们在缓存服务接口中,根据 productId 创建 command 并执行,获取到商品数据。 + +```java +@RequestMapping("/getProductInfo") +@ResponseBody +public String getProductInfo(Long productId) { + HystrixCommand 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 拉回来。 + +```java +public class GetProductInfosCommand extends HystrixObservableCommand { + + private String[] productIds; + + public GetProductInfosCommand(String[] productIds) { + // 还是绑定在同一个线程池 + super(HystrixCommandGroupKey.Factory.asKey("GetProductInfoGroup")); + this.productIds = productIds; + } + + @Override + protected Observable construct() { + return Observable.unsafeCreate((Observable.OnSubscribe) 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 方法,获取到所有商品数据。 +```java +public String getProductInfos(String productIds) { + String[] productIdArray = productIds.split(","); + HystrixObservableCommand getProductInfosCommand = new GetProductInfosCommand(productIdArray); + Observable observable = getProductInfosCommand.observe(); + + observable.subscribe(new Observer() { + @Override + public void onCompleted() { + System.out.println("获取完了所有的商品数据"); + } + + @Override + public void onError(Throwable e) { + e.printStackTrace(); + } + + /** + * 获取完一条数据,就回调一次这个方法 + * @param productInfo + */ + @Override + public void onNext(ProductInfo productInfo) { + System.out.println(productInfo); + } + }); + return "success"; +} +``` + +我们回过头来,看看 Hystrix 线程池技术是如何实现资源隔离的。 + +![hystrix-thread-pool-isolation](/img/hystrix-thread-pool-isolation.png) + +从 Nginx 开始,缓存都失效了,那么 Nginx 通过缓存服务去调用商品服务。缓存服务默认的线程大小是 10 个,最多就只有 10 个线程去调用商品服务的接口。即使商品服务接口故障了,最多就只有 10 个线程会 hang 死在调用商品服务接口的路上,缓存服务的 tomcat 内其它的线程还是可以用来调用其它的服务,干其它的事情。 \ No newline at end of file diff --git a/docs/high-availability/img/hystrix-thread-pool-isolation.png b/docs/high-availability/img/hystrix-thread-pool-isolation.png new file mode 100644 index 0000000000000000000000000000000000000000..d51983ba5412c6623d9cc671cd811afc77c35111 GIT binary patch literal 12597 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 M8(b>TxOV4X08`lMJOBUy literal 0 HcmV?d00001 diff --git a/docs/high-concurrency/redis-consistence.md b/docs/high-concurrency/redis-consistence.md index e1bddc6..f8a3f0b 100644 --- a/docs/high-concurrency/redis-consistence.md +++ b/docs/high-concurrency/redis-consistence.md @@ -22,7 +22,7 @@ 另外更新缓存的代价有时候是很高的。是不是说,每次修改数据库的时候,都一定要将其对应的缓存更新一份?也许有的场景是这样,但是对于**比较复杂的缓存数据计算的场景**,就不是这样了。如果你频繁修改一个缓存涉及的多个表,缓存也频繁更新。但是问题在于,**这个缓存到底会不会被频繁访问到?** -举个栗子,一个缓存涉及的表的字段,在 1 分钟内就修改了 20 次,或者是 100 次,那么缓存更新 20 次,100 次;但是这个缓存在 1 分钟内只被读取了 1 次,有**大量的冷数据**。实际上,如果你只是删除缓存的话,那么在 1 分钟内,这个缓存不过就重新计算一次而已,开销大幅度降低。**用到缓存才去算缓存。** +举个栗子,一个缓存涉及的表的字段,在 1 分钟内就修改了 20 次,或者是 100 次,那么缓存更新 20 次、100 次;但是这个缓存在 1 分钟内只被读取了 1 次,有**大量的冷数据**。实际上,如果你只是删除缓存的话,那么在 1 分钟内,这个缓存不过就重新计算一次而已,开销大幅度降低。**用到缓存才去算缓存。** 其实删除缓存,而不是更新缓存,就是一个 lazy 计算的思想,不要每次都重新做复杂的计算,不管它会不会用到,而是让它到需要被使用的时候再重新计算。像 mybatis,hibernate,都有懒加载思想。查询一个部门,部门带了一个员工的 list,没有必要说每次查询部门,都里面的 1000 个员工的数据也同时查出来啊。80% 的情况,查这个部门,就只是要访问这个部门的信息就可以了。先查部门,同时要访问里面的员工,那么这个时候只有在你要访问里面的员工的时候,才会去数据库里面查询 1000 个员工。 diff --git a/docs/high-concurrency/redis-expiration-policies-and-lru.md b/docs/high-concurrency/redis-expiration-policies-and-lru.md index 38fb3fe..9fea56c 100644 --- a/docs/high-concurrency/redis-expiration-policies-and-lru.md +++ b/docs/high-concurrency/redis-expiration-policies-and-lru.md @@ -27,7 +27,7 @@ redis 过期策略是:**定期删除+惰性删除**。 但是问题是,定期删除可能会导致很多过期 key 到了时间并没有被删除掉,那咋整呢?所以就是惰性删除了。这就是说,在你获取某个 key 的时候,redis 会检查一下 ,这个 key 如果设置了过期时间那么是否过期了?如果过期了此时就会删除,不会给你返回任何东西。 -> 获取key 的时候,如果此时 key 已经过期,就删除,不会返回任何东西。 +> 获取 key 的时候,如果此时 key 已经过期,就删除,不会返回任何东西。 但是实际上这还是有问题的,如果定期删除漏掉了很多过期 key,然后你也没及时去查,也就没走惰性删除,此时会怎么样?如果大量过期 key 堆积在内存里,导致 redis 内存块耗尽了,咋整? @@ -36,9 +36,9 @@ redis 过期策略是:**定期删除+惰性删除**。 ### 内存淘汰机制 redis 内存淘汰机制有以下几个: - noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧,实在是太恶心了。 -- **allkeys-lru**:当内存不足以容纳新写入数据时,在**键空间**中,移除最近最少使用的 key(这个是**最常用**的) +- **allkeys-lru**:当内存不足以容纳新写入数据时,在**键空间**中,移除最近最少使用的 key(这个是**最常用**的)。 - allkeys-random:当内存不足以容纳新写入数据时,在**键空间**中,随机移除某个 key,这个一般没人用吧,为啥要随机,肯定是把最近最少使用的 key 给干掉啊。 -- volatile-lru:当内存不足以容纳新写入数据时,在**设置了过期时间的键空间**中,移除最近最少使用的 key(这个一般不太合适) +- volatile-lru:当内存不足以容纳新写入数据时,在**设置了过期时间的键空间**中,移除最近最少使用的 key(这个一般不太合适)。 - volatile-random:当内存不足以容纳新写入数据时,在**设置了过期时间的键空间**中,**随机移除**某个 key。 - volatile-ttl:当内存不足以容纳新写入数据时,在**设置了过期时间的键空间**中,有**更早过期时间**的 key 优先移除。 diff --git a/img/hystrix-thread-pool-isolation.png b/img/hystrix-thread-pool-isolation.png new file mode 100644 index 0000000000000000000000000000000000000000..d51983ba5412c6623d9cc671cd811afc77c35111 GIT binary patch literal 12597 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 M8(b>TxOV4X08`lMJOBUy literal 0 HcmV?d00001