线程隔离和信号量隔离

3,215 阅读2分钟

比较常用的是sentinel,一直不知道豪猪哥的线程池隔离是什么意思,看到一篇写的不错的,做个小笔记

1 线程隔离

可以理解为一种舱壁隔离将船体内部空间区隔划分成若干个隔舱,一旦某几个隔舱发生破损进水,水流不会在其间相互流动,如此一来船舶在受损时,依然能具有足够的浮力和稳定性,进而减低立即沉船的危险。

image.png

在一个高度服务化的系统中,我们实现的一个业务逻辑通常会依赖多个服务,比如: 商品详情展示服务会依赖商品服务, 价格服务, 商品评论服务. 如图所示:

image.png

调用三个依赖服务会共享商品详情服务的线程池. 如果其中的商品评论服务不可用, 就会出现线程池里所有线程都因等待响应而被阻塞, 从而造成服务雪崩. 如图所示:

image.png

Hystrix通过将每个依赖服务分配独立的线程池进行资源隔离, 从而避免服务雪崩.

image.png

2 信号量隔离

Hystrix 的信号量隔离限制对某个资源调用的异常比例

Sentinel 在信号量隔离的限制上提供了更多的策略选择,基于慢调用比例、异常比例和异常数

2.1 实现原理

Sentinel 底层采用高性能的滑动窗口数据结构 LeapArray 来统计实时的秒级指标数据,在 信号量隔离的底层实现中, 通过根据不同的策略,如 异常数 策略,统计在 滑动窗口区间内, 异常请求量的比例,来决定对服务进行熔断降级处理。

image.png

1、慢调用比例 (SLOW_REQUEST_RATIO)

设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当调用请求数量大于阀值,触发熔断。阀值设置,100ms响应,10个请求 如下图所示:

image.png

2、异常比例 (ERROR_RATIO

当单位统计时长内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。阀值设置 20% 如下图所示:

image.png

3、异常数 (ERROR_COUNT)

当单位统计时长内的异常数目超过阈值之后会自动进行熔断。阀值设置 5 如图所示:

image.png

3 熔断降级组件对比

image.png

参考

juejin.cn/post/698321… segmentfault.com/a/119000000…