前言
当链路中某个应用出现不稳定,导致整个链路调用变慢,如果不加控制可能导致雪崩。这种情况如何处理呢?
一、慢调用现象分析
在分布式链路中调用中,调用关系如下,methodA1与methodA2在同一个应用中。
链路标号 |
调用链 |
链路1 |
methodX->methodA1->methodB |
链路2 |
methodY->methodA2->methodC |
链路3 |
methodZ->methodA2->methodC |
下游服务MethodB由于不稳定导致慢调用时,如下图所示:
慢调用可能导致如下情况:
二、线程池隔离解决方案
为了消除某条链路慢调用挤压其他链路,以及APP服务不可用导致雪崩情况。通过对methodA1和methodA2分别配置不同的线程池进行隔离,这样链路1不稳定不会波及到链路2和链路3。
线程池隔离方案优缺点
优点
|
隔离性好、链路之间不会互相干扰 |
缺点
|
设置线程池过大业务低点造成大量线程空转
|
三、Sentinel并发控制解决方案
Sentinel在流控控制规则中有提供FlowRule提供基于线程的并发控制。FlowRule中将grade设置为0表示并发线程控制,设置1表示QPS。
1.实现原理
Sentinel不对线程总数控制,只对线程进行统计,通过统计的线程数与用户设置的阈值进行比较,如果小于阈值则放行;大于阈值抛出BlockException,禁止通行。统计的模型还是基于滑动时间口,详细源码分析见前面文章。
2.模拟并发控制效果
下面的FlowThreadDemo示例中,模拟methodA调用methodB,methodB发生了慢调用(sleep 2秒),过了一会(40秒)后,methodB的慢调用解除(sleep 20毫秒)。
代码截图
运行效果
小结:通过Sentinel中FlowRule的线程并发控制,可以有效地对不同分布式RPC链路进行隔离,对出现慢调用的链路起到保护作用。
作者丨梁勇
来源丨瓜农老梁
欢迎关注公众号「瓜农老梁」
「瓜农老梁 学习同行」