Sentinel客户端调用并发控制

前言

当链路中某个应用出现不稳定,导致整个链路调用变慢,如果不加控制可能导致雪崩。这种情况如何处理呢? 

一、慢调用现象分析 

在分布式链路中调用中,调用关系如下,methodA1与methodA2在同一个应用中。

链路标号

调用链 

链路1 

methodX->methodA1->methodB 

链路2 

methodY->methodA2->methodC 

链路3 

methodZ->methodA2->methodC 

下游服务MethodB由于不稳定导致慢调用时,如下图所示: 

慢调用可能导致如下情况:

  • 链路1线程数增多对methodA1所在的APP资源造成挤压

  • 对APP资源的过度挤压对链路2和链路3造成不稳定

  • 极端情况导致整个APP服务不可用

  • APP服务的不可用导致整个链路出现故障引发雪崩 

二、线程池隔离解决方案 

为了消除某条链路慢调用挤压其他链路,以及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链路进行隔离,对出现慢调用的链路起到保护作用。 

作者丨梁勇
来源丨瓜农老梁
欢迎关注公众号「瓜农老梁」


「瓜农老梁  学习同行」    

       

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值