几种限流器(RateLimiter)原理与实现

来源: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言如何随机选择入口,c语言随机排列-----适用于初学者

本程序只是实现了基本的数字随机排列&#xff0c;如有不懂&#xff0c;留言提问。。。// 随机排序.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "time.h"#include "stdio.h"#include "stdlib.h"int _tmain(int …

The Best and the Worst

Joe Sanders has the most beautiful garden in our town. Nearly everybody enters for “The Nicest Garden Competition” each year,but Joe wins every time.Bill Friths garden is larger than Joes.Bill works harder than Joe and grows more flowlers and vegetables,…

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

来源&#xff1a;https://www.cnblogs.com/zhandouBlog/p/11743660.html 前言 RateLimiter是基于令牌桶算法实现的一个多线程限流器&#xff0c;它可以将请求均匀的进行处理&#xff0c;当然他并不是一个分布式限流器&#xff0c;只是对单机进行限流。它可以应用在定时拉取接…

185页深度报告 扒一扒AI金融的老底【附下载】

来源&#xff1a;智东西概要&#xff1a;2016年&#xff0c;中国爆出8家独角兽&#xff0c;总估值964亿美元位冠全球&#xff1b;2017年&#xff0c;毕马威全球百佳金融科技企业前三甲&#xff0c;蚂蚁金服、众安保险、趣店&#xff0c;皆来自中国&#xff1b;过往两年&#xf…

夹娃娃动画Android,手机模拟抓娃娃

手机模拟抓娃娃让你通过手机足不出户也能感受娃娃机的乐趣,萌趣的卡通形象,清新治愈的设计风格,简单上手的玩法,赶快加入进来冲击最高分吧,点击下载手机模拟抓娃娃开始你的挑战&#xff01;手机模拟抓娃娃介绍手机模拟抓娃娃游戏是一款模拟进行的真人在线抓娃娃的掌上控制的休闲…

Inline Method(内联函数)

一个函数的本体与名称同样清楚易懂 int getRating() {return moreThanFiveLateDeliveries() ? 2 : 1; }boolean moreThanFiveLateDeliveries() {return numberOfLateDelivers > 5; } 重构后 int getRating() {return (numberOfLateDelivers > 5) ? 2 : 1; }

XML 简单操作

<?xml:namespace prefix o /> <?xml version"1.0" encoding"gb2312"?><bookstore> <book genre"fantasy" ISBN"2-3631-4"> <title>Oberons Legacy</title> <author>Corets, Ev…

android友盟错误日志,Taro(React-native)集成友盟错误日志分析U-App移动统计

1、先去友盟官网注册应用&#xff0c;获取到appkey&#xff0c;友盟移动统计分析U-App&#xff0c;这个步骤就不贴出来了&#xff0c;需要注意的是ios和Android 不能使用同一个appkey&#xff0c;需要分别创建两个应用&#xff0c;应用名称可以在后面加上平台名称&#xff0c;例…

2018年中国新零售市场研究报告——概念、模式与案例【附下载】

来源&#xff1a;亿欧概要&#xff1a;“新零售” 之“新”在于顺势下的“变化”&#xff0c;不应该局限于“阿里巴巴的新零售”。报告尝试从一个更宽广的视角&#xff0c;对当前零售业变化的背景和各种驱动因素进行分析&#xff0c;总结当下时间段零售行业参与者的新动作&…

[导入]ASP.NET 配置节架构

ASP.NET 配置节架构文章来源:http://blog.csdn.net/21aspnet/archive/2004/11/04/167417.aspx转载于:https://www.cnblogs.com/zhaoxiaoyang2/archive/2004/11/05/816261.html

重构--思维导图

#原图 System.out.println("https://www.processon.com/view/60fa8c441e085366ea4c2b9e?fromnew1");

Android代码导出数据库,导入/导出到android sqlite数据库

我看过几篇关于如何在android中导入和导出数据库的帖子,我找到了这些代码,但我似乎无法使它工作.我收到错误java.io.filenotfoundexception / storage / sdcard0 / BackupFolder / DatabaseName&#xff1a;打开失败的ENOENT(没有这样的文件或目录).我改变了一些东西,但我仍然没…

谷歌Jeff Dean团队提出利用深度学习对「电子健康记录」数据进行分析,可提高医疗诊断预测的准确性

原文来源&#xff1a;arXiv作者&#xff1a;Alvin Rajkomar、Eyal Oren、Kai Chen、Andrew M. Dai、Nissan Hajaj、Peter J. Liu、Xiaobing Liu, Mimi Sun、Patrik Sundberg、Hector Yee、Kun Zhang、Yi Zhang、Gavin E. Duggan、Gerardo Flores、Michaela Hardt、Jamie Irvine…

想太多……

想太多总是伤神&#xff0c;不晓得是因为早上打针打太多了还是晚上想太多了&#xff0c;现在有点头疼…… 被成全的人&#xff0c;应该是幸福的人&#xff0c;还有什么好抱怨的呢……亲眼看到成全我的人的痛苦&#xff0c;难道不应该更珍惜现在的快乐和幸福么&#xff1f; 不去…

Inline Temp(内联临时变量)

一个临时变量&#xff0c;只被一个简单表达式赋值一次&#xff0c;而它妨碍了其他重构手法 double basePrice anOrder.basePrice(); return basePrice > 1000; 重构后 return anOrder.basePrice() > 1000;

android卫星菜单中间,Android卫星菜单:android-satellite-menu

android-satellite-menu实现点击主按钮&#xff0c;会弹出多个围绕着主按钮排列的子按钮&#xff0c;从而形成一个卫星弹出式菜单。子按钮弹出和消失的动画效果都很棒。这种弹出式菜单按钮应用在Path2.0中。用法在你的view xml中添加组件定义&#xff0c;如下示例&#xff1a;x…

NLP顶级专家Dan Roth :自然语言处理领域近期的任务和主要应用

来源&#xff1a;AI科技大本营概要&#xff1a;1月28日消息&#xff0c;《麻省理工科技评论》新兴科技峰会EmTech China在北京召开&#xff0c;营长也受邀参加&#xff0c;会上有多位人工智能领域的重磅大佬出没&#xff0c;Dan Roth 就是其中一位。1月28日消息&#xff0c;《麻…

ASP面向对象编程探讨及比较

ASP是Microsoft于较早期推出的动态网页编程技术&#xff0c;但其结合ADO对数据库方便快捷的访问、结合XML、COM/ActiveX等其它技术 实现服务器多层结构的功能使它在今天还有着顽强的生命力&#xff0c;并且依然有着一定的发展。ASP.Net虽然在架构上完全不同于ASP&#xff0…

【重点!!!】【单调栈】84.柱状图中最大矩形

题目 法1&#xff1a;单调栈[原版] O(N)O(N) 必须掌握算法&#xff01;&#xff01;&#xff01; class Solution {public int largestRectangleArea(int[] heights) {int n heights.length, res 0;int[] leftMin new int[n], rightMin new int[n];Stack<Integer>…

android support library github,Android Support Library 之 夜间模式

原标题&#xff1a;Android Support Library 之 夜间模式前言夜间模式实现方式&#xff1a;1、通过切换theme来实现夜间模式。优点&#xff1a;可以匹配多套主题&#xff0c;并不局限于黑白模式缺点&#xff1a;需要大量定义主题详见博客&#xff1a;http://wuxiaolong.me/2015…