首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

dubbo是如何控制并发数和限流的?

0x01: ExecuteLimitFilter

ExecuteLimitFilter ,在服务提供者,通过 的 "executes" 统一配置项开启:

表示每服务的每方法最大可并行执行请求数。

ExecuteLimitFilter是通过信号量来实现的对服务端的并发数的控制。

ExecuteLimitFilter执行流程:

首先会去获得服务提供者每服务每方法最大可并行执行请求数

如果每服务每方法最大可并行执行请求数大于零,那么就基于基于服务 URL + 方法维度获取一个RpcStatus实例

通过RpcStatus实例获取一个信号量,若果获取的这个信号量调用tryAcquire返回false,则抛出异常

如果没有抛异常,那么就调用RpcStatus静态方法beginCount,给这个 URL + 方法维度开始计数

调用服务

调用结束后计数调用RpcStatus静态方法endCount,计数结束

释放信号量

ExecuteLimitFilter

我们接下来看看RpcStatus这个类

这个方法很简单,大概就是给RpcStatus这个类里面的静态属性METHOD_STATISTICS里面设值。外层的map是以url为key,里层的map是以方法名为key。

这个方法是获取信号量,如果这个实例里面的信号量是空的,那么就添加一个,如果不是空的就返回。

0x02: TPSLimiter

TpsLimitFilter 过滤器,用于服务提供者中,提供限流的功能。

配置方式:

通过 配置项,添加到 或 或 中开启,例如:

通过 配置项,设置 TPS 周期。

源码分析

TpsLimitFilter

invoke方法调用了DefaultTPSLimiter的isAllowable,我们进入到isAllowable方法看一下

DefaultTPSLimiter

若要限流,调用 StatItem#isAllowable(url, invocation) 方法,根据 TPS 限流规则判断是否限制此次调用。

StatItem

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20201217A0J53T00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券