前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Sentinel客户端调用并发控制

Sentinel客户端调用并发控制

作者头像
瓜农老梁
发布2020-11-03 14:57:31
9140
发布2020-11-03 14:57:31
举报
文章被收录于专栏:瓜农老梁瓜农老梁

前言

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

一、慢调用现象分析

在分布式链路中调用中,调用关系如下,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链路进行隔离,对出现慢调用的链路起到保护作用。

作者丨梁勇 来源丨瓜农老梁

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 瓜农老梁 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档