Dubbo令牌桶限流代码分析-StatItem类

https://blog.csdn.net/cbhyk/article/details/86064725

Dubbo默认使用令牌桶算法实现限流,令牌桶相关代码在org.apache.dubbo.rpc.filter.tps.StatItem类中。StatItem类使用一个AutomicInteger对象管理令牌,管理令牌的主要代码如下:

int value = token.get();
boolean flag = false;
while (value > 0 && !flag) {
    flag = token.compareAndSet(value, value - 1);
    value = token.get();
}
return flag;

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这段代码的功能是判断是否还有剩余令牌,并把令牌数减1。

用AutomicInteger类的decrementAndGet方法也能达到类似的效果,并且代码量更少,代码如下:

return token.decrementAndGet() >= 0;

   
   
  • 1

但是Dubbo中的代码有以下两个好处:

  1. Dubbo代码所用的compareAndSet方法,性能上优于decrementAndGet,compareAndSet只需要调1次JNI方法,而decrementAndGet要2次。至于代码中的两次get方法调用,是直接返回当前值,可以忽略不计。

  2. 在令牌已经用完的情况下,Dubbo所采用的代码不需要更新token的值,而decrementAndGet方法每次调用都需要更新令牌计数值,需要调用2次JNI方法才能完成。

                                </div>
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-e44c3c0e64.css" rel="stylesheet">
                </div>
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hello_world!

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值