来源:https://blog.csdn.net/netyeaxi/article/details/104270337

限流器(RateLimiter)主要有两种算法:

漏桶算法
令牌桶算法
它们都是网络世界中流量整形(Traffic Shaping)或速率限制(Rate Limiting)时经常使用的算法。

漏桶算法

漏桶算法(Leaky Bucket),它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。

漏桶可以看作是一个带有常量服务时间的单服务器队列,如果漏桶(包缓存)溢出,那么数据包会被丢弃。 在网络中,漏桶算法可以控制端口的流量输出速率,平滑网络上的突发流量,实现流量整形,从而为网络提供一个稳定的流量。

如图所示,把请求比作是水,水来了都先放进桶里,并以限定的速度出水,当水来得过猛而出水不够快时就会导致水直接溢出,即拒绝服务。

令牌桶算法

令牌桶算法(Token Bucket),用来控制发送到网络上的数据的数目,并允许突发数据的发送。

令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。从原理上看,令牌桶算法和漏桶算法是相反的,一个“进水”,一个是“漏水”。

漏桶算法&令牌桶算法的区别

漏桶算法与令牌桶算法的区别在于,漏桶算法能够强行限制数据的传输速率,令牌桶算法能够在限制数据的平均传输速率的同时还允许某种程度的突发传输。

需要注意的是,在某些情况下,漏桶算法不能够有效地使用网络资源,因为漏桶的漏出速率是固定的,所以即使网络中没有发生拥塞,漏桶算法也不能使某一个单独的数据流达到端口速率。因此,漏桶算法对于存在突发特性的流量来说缺乏效率。而令牌桶算法则能够满足这些具有突发特性的流量。通常,漏桶算法与令牌桶算法结合起来为网络流量提供更高效的控制。

下面介绍Java中一些实现了令牌桶算法的常用组件。

单机限流

1、resilience4j-ratelimiter

https://resilience4j.readme.io/docs/ratelimiter

<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-ratelimiter</artifactId>
    <version>1.3.1</version>
</dependency>

RateLimiterConfig config = RateLimiterConfig.custom()
  .limitRefreshPeriod(Duration.ofMillis(1))
  .limitForPeriod(10)
  .timeoutDuration(Duration.ofMillis(25))
  .build();
 
// Create registry
RateLimiterRegistry rateLimiterRegistry = RateLimiterRegistry.of(config);
 
// Use registry
RateLimiter rateLimiterWithDefaultConfig = rateLimiterRegistry
  .rateLimiter("name1");
 
RateLimiter rateLimiterWithCustomConfig = rateLimiterRegistry
  .rateLimiter("name2", config)
2、Guava: Google Core Libraries for Java

https://github.com/google/guava

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>28.2-jre</version>
  <!-- or, for Android: -->
  <version>28.2-android</version>
</dependency>

RateLimiter limiter = RateLimiter.create(1);//限制qps最大为1
System.out.println(limiter.acquire()); //输出阻塞的时间

分布式限流

1、Redisson - Redis Java client

https://github.com/redisson/redisson

<dependency>
   <groupId>org.redisson</groupId>
   <artifactId>redisson</artifactId>
   <version>3.12.1</version>
</dependency>

Config config = Config.fromYAML(new File("config-file.yaml"));
RedissonClient redisson = Redisson.create(config);
RRateLimiter rateLimiter = redisson.getRateLimiter("myRateLimiter");
 2、alibaba - Sentinel

https://github.com/alibaba/Sentinel

https://github.com/alibaba/Sentinel/wiki/介绍

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.1</version>
</dependency>

private static void initFlowRules(){
    List<FlowRule> rules = new ArrayList<>();
    FlowRule rule = new FlowRule();
    rule.setResource("HelloWorld");
    rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
    // Set limit QPS to 20.
    rule.setCount(20);
    rules.add(rule);
    FlowRuleManager.loadRules(rules);
}
public static void main(String[] args) {
    // 配置规则.
    initFlowRules();
 
    while (true) {
        // 1.5.0 版本开始可以直接利用 try-with-resources 特性
        try (Entry entry = SphU.entry("HelloWorld")) {
            // 被保护的逻辑
            System.out.println("hello world");
    } catch (BlockException ex) {
            // 处理被流控的逻辑
        System.out.println("blocked!");
    }
    }
}
参考文档

接口限流算法:漏桶算法和令牌桶算法
https://my.oschina.net/u/4129361/blog/3053350

漏桶算法&令牌桶算法理解及常用的算法
https://www.jianshu.com/p/c02899c30bbd
————————————————
版权声明:本文为CSDN博主「netyeaxi」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/netyeaxi/article/details/104270337

几种限流器(RateLimiter)原理与实现相关推荐

  1. Java:限流器(RateLimiter)原理与实现

    限流器(RateLimiter)主要有两种算法: 漏桶算法 令牌桶算法 它们都是网络世界中流量整形(Traffic Shaping)或速率限制(Rate Limiting)时经常使用的算法. 漏桶算法 ...

  2. guava限流器RateLimiter原理及源码分析

    来源:https://www.cnblogs.com/zhandouBlog/p/11743660.html 前言 RateLimiter是基于令牌桶算法实现的一个多线程限流器,它可以将请求均匀的进行 ...

  3. Guava限流器RateLimiter

    日常开发中,经常会遇到一些需要限流的场景.我们希望每一秒的请求量不要超过某一个阈值,以防止过多的请求对服务造成过大的压力.常见的限流算法有计数器法.漏桶算法和令牌桶算法,下面我们简单的了解一下这几个算 ...

  4. 逐行拆解Guava限流器RateLimiter

    日常开发中,经常会遇到一些需要限流的场景.我们希望每一秒的请求量不要超过某一个阈值,以防止过多的请求对服务造成过大的压力.常见的限流算法有计数器法.漏桶算法和令牌桶算法,下面我们简单的了解一下这几个算 ...

  5. 动图|帮你一次性搞清楚 40种传感器工作原理

    来源:一览众车/东方仿真 物联网智库 转载 摘要:帮你一次性搞清楚 40种传感器工作原理 扩散硅式压力传感器 应变加速度感应器 压阻式传感器测量液位的工作原理 MQN型气敏电阻结构及测量电路 气泡式水 ...

  6. 网卡设置 多网卡的7种bond模式原理

    多网卡的7种bond模式原理 Linux 多网卡绑定 网卡绑定mode共有七种(0~6) bond0.bond1.bond2.bond3.bond4.bond5.bond6 常用的有三种 mode=0 ...

  7. 限流器(一):guava应用级限流器RateLimiter之SmoothBursty

    一.前言 二.令牌桶限流器示意图 三.使用示例 四.SmoothBursty关键属性 五.SmoothBursty限流器时序图 1.创建限流器 2.请求令牌 3.尝试请求令牌 六.测试用例 七.总结 ...

  8. 徐无忌MySQL笔记:MySQL数据库锁有几种?实现原理是什么?

    徐无忌MySQL笔记:MySQL数据库锁有几种?实现原理是什么? 完成:第一遍 1.数据库并发控制通过什么实现? 当多个事务并发方法对同一个数据进行操作 通过数据库锁实现对数据库的并发控制. 2.锁类 ...

  9. 【转载】多网卡的7种bond模式原理

    多网卡的7种bond模式原理 Linux 多网卡绑定 网卡绑定mode共有七种(0~6) bond0.bond1.bond2.bond3.bond4.bond5.bond6 常用的有三种 mode=0 ...

最新文章

  1. 基于网格的聚类算法STING
  2. ios之第一个程序Hello word, I am chenyu !
  3. 推荐20款基于 jQuery CSS 的文本效果插件
  4. android9叫什么名字,白猜这么多名字!谷歌Android 9.0正式发布:命名Android Pie
  5. postmapping注解_Swagger常用注解
  6. vivo6.0系统怎么样不用root激活XPOSED框架的方法
  7. 计算机中 amp 是什么符号,这里面的amp;amp;,||是什么意思,相当与数学里面的什么符号?...
  8. .Net免费公开课视频+资料+源码+经典牛逼 汇总篇【持续更新】
  9. 官服好吗_【知否的唯美手绘图】看到齐衡身穿“官服”时,网友:好帅啊!
  10. 【艾琪出品】《计算机应用基础》【试题汇总9】
  11. php seo技巧,十个对排名最有效的SEO​技巧
  12. 【美】纳西姆·尼古拉斯·塔勒布 - 随机生存的智慧(2013年7月16日)
  13. Chapter16/17-项目2:数据可视化
  14. android系统应用开发常用的adb命令个人收藏集锦(不断更新)
  15. java游戏回转贝贝龙2下载,崩坏3:暴雨将至最后的剧情,为何贝贝龙拼死保护琪亚娜...
  16. win10隐藏输入法指示器的设置方法
  17. python网格交易法详解_3分钟带你了解网格交易法
  18. 在线 xml转java对象_XML转Java实体对象
  19. 工具篇---Node.js的安装和配置
  20. 配置NFS服务器和NFS客户端

热门文章

  1. MVP模式在Android中的应用(附UML高清大图,使用RecyclerView举例)
  2. 【再认识】认知智能下需要的实体知识与事件知识
  3. 单链表的按位置插入和删除
  4. AOP和Spring AOP介绍
  5. k8s 基础概念和术语
  6. ConcurrentHashMap源码剖析(1.8版本)
  7. MikroTik RouterOS x86最大内存只能支持2G
  8. Go语言入门——Go语言环境搭建
  9. 双RocketMq集群的搭建
  10. 大数据世界要熟悉的5门语言