限流是高可用服务需要具备的能力之一 ,粗暴简单的就像我们之前做的并发数控制。好一点的有tps限流,可用令牌桶等算法实现。《亿级流量网站架构核心技术》一书P67限流详解也有讲。dubbo提供了此机制,TpsLimitFilter。guava也提供了相应的工具类RateLimiter。

1. dubbo提供的tps限流

1.1 demo使用

1.1.1 在source folder下放置,META-INF/dubbo/com.alibaba.dubbo.rpc.Filter

里面写入 tpslimiter=com.alibaba.dubbo.rpc.filter.TpsLimitFilter

表示将TpsLimitFilter这个filter的扩展给装配给dubbo

1.1.2 provider侧的配置

<dubbo:service interface="org.simonme.dubbo.demo.provider.service.HelloService" ref="m00001.app001.xx.helloService" filter="tpslimiter">
<dubbo:parameter key="tps" value="5" />
</dubbo:service>

意思对HelloService 这个接口在provider侧做tps为5的限流,默认间隔是60s,可以通过tps.interval这个parameter进行配置,单位是毫秒。注意此处配置的tps为5,不是每秒限制通过5个以内的请求,而是单位时间间隔内通过5个以内的请求。关于单位时间间隔前面解释了。

1.2 如果超限了是什么现象?

客户端会抛出rpc调用异常:

com.alibaba.dubbo.rpc.RpcException: Failed to invoke service org.simonme.dubbo.demo.provider.service.HelloService.sayHello because exceed max service tps

1.3 原理分析

主要是DefaultTPSLimiterStatItem两个类配合完成。采用的是令牌桶算法,实现在StatItem类中。

大意是:

每隔一个单位时间后重置令牌桶中令牌的数量,然后每次请求来的时候减1,减到小于0时,拒绝请求。

long now = System.currentTimeMillis();
if (now > lastResetTime + interval) {
token.set(rate);
lastResetTime = now;
} int value = token.get();
boolean flag = false;
while (value > 0 && !flag) {
flag = token.compareAndSet(value, value - 1);
value = token.get();
}

注意:此实现依赖系统时间,如果想用相对时间实现,可以参见这里 dubbo的TPS限流模块在运行时系统时间发生变化的情况下限流不能正常工作 #2345

2. spring cloud

对于采用spring cloud的架构的项目,可以借助guava的RateLimiter来实现ZuulFilter的子类来达成tps限流的目的。

最新文章

  1. WPF整理-二进制资源和内容
  2. linux挂着U盘和光盘
  3. wampserver配置域名
  4. 转:Oracle中merge into的使用
  5. Visual Studio 自定义控件不显示在工具箱
  6. YTU 2609: A改错题--学生信息的输入和输出
  7. WebService的发布及客户端的调用
  8. 【BZOJ 3110】 [Zjoi2013]K大数查询(整体二分)
  9. 浏览器JS报错Uncaught RangeError: Maximum call stack size exceeded?
  10. 18、MySQL内存体系架构及参数总结
  11. js正则表达式中的问号使用技巧总结
  12. javaweb 学习的好地方
  13. php的一些小笔记--字符串
  14. lambda left join .DefaultIfEmpty
  15. 34. LotusScript中的错误处理程序
  16. 利用UICollectionView实现列表和宫格视图的切换
  17. R语言-图形辅助
  18. windows server 2008 r2安装windows media player
  19. 转载:Linux操作系统(1.3.1)《深入理解Nginx》(陶辉)
  20. 2018.11.14 uoj#34. 多项式乘法(fft)

热门文章

  1. (六)我的JavaScript系列:更好的JavaScript之CoffeeScript
  2. PostgreSQL缓存
  3. pod install Pull is not possible because you have unmerged files.
  4. 字符串转换JSON 的方法
  5. phpmyadmin设置不密码,不登录直接进入
  6. 剑指offer18 树的子结构
  7. Ajax的原理及Django上传组件
  8. cocos2d-x之CCCardinalSplineBy
  9. An Intuitive Explanation of Convolutional Neural Networks
  10. CF-1114 (2019/02/11)