在开发高并发系统时,有三把利器来保护系统:缓存、降级和限流。下面来看看限流量的一些算法:

1.计数器法:

它是限流算法中最简单最容易的一种算法,比如我们要求某一个接口,1分钟内的请求不能超过10次,我们可以在开始时设置一个计数器,

每次请求,该计数器+1;如果该计数器的值大于10并且与第一次请求的时间间隔在1分钟内,那么说明请求过多;如果该请求与第一次请求

的时间间隔大于1分钟,并且该计数器的值还在限流范围内,那么重置该计数器。具体代码如下:

public class CounterDemo {
public long timeStamp = getNowTime();
public int reqCount = 0;
public final int limit = 100; // 时间窗口内最大请求数
public final long interval = 1000; // 时间窗口ms
public boolean grant() {
long now = getNowTime();
if (now < timeStamp + interval) {
// 在时间窗口内
reqCount++;
// 判断当前时间窗口内是否超过最大请求控制数
return reqCount <= limit;
}
else {
timeStamp = now;
// 超时后重置
reqCount = 1;
return true;
}
}
}
不过,以上代码有致命问题,当遇到恶意请求,在0:59时,瞬间请求100次,并且在1:00请求100次,那么这个用户在1秒内请求了200次,
用户可以在重置节点突发请求,而瞬间超过我们设置的速率限制,用户可能通过算法漏洞击垮我们的应用。如下图,如何解决呢,看下边的滑动窗口算法。

2.滑动窗口算法:

在上图中,整个红色矩形框是一个时间窗口,在我们的例子中,一个时间窗口就是1分钟,然后我们将时间窗口进行划分,如上图我们把滑动窗口

划分为6格,所以每一格代表10秒,每超过10秒,我们的时间窗口就会向右滑动一格,每一格都有自己独立的计数器,例如:一个请求在0:35到达,

那么0:30到0:39的计数器会+1,那么滑动窗口是怎么解决临界点的问题呢?如上图,0:59到达的100个请求会在灰色区域格子中,而1:00到达的请求

会在红色格子中,窗口会向右滑动一格,那么此时间窗口内的总请求数共200个,超过了限定的100,所以此时能够检测出来触发了限流。

回头看看计数器算法,会发现,其实计数器算法就是窗口滑动算法,只不过计数器算法没有对时间窗口进行划分,所以是一格。

由此可见,当滑动窗口的格子划分越多,限流的统计就会越精确。

3.漏桶算法:

漏桶算法,又称 leaky bucket ,如下图:

这个算法很简单。首先,我们有一个固定容量的桶,有水进来,也有水出去。对于流进来的水,我们无法预计共有多少水流进来,也无法预计流水速度,但

对于流出去的水来说,这个桶可以固定水流的速率,而且当桶满的时候,多余的水会溢出来。

public class LeakyDemo {
public long timeStamp = getNowTime();
public int capacity; // 桶的容量
public int rate; // 水漏出的速度
public int water; // 当前水量(当前累积请求数)
public boolean grant() {
long now = getNowTime();
water = max(0, water - (now - timeStamp) * rate); // 先执行漏水,计算剩余水量
timeStamp = now;
if ((water + 1) < capacity) {
// 尝试加水,并且水还未满
water += 1;
return true;
}
else {
// 水满,拒绝加水
return false;
}
}
}
4.令牌桶算法:
又称token bucket,如下图:

从上图中可以看出,令牌算法有点复杂,桶里存放着令牌token。桶一开始是空的,token以固定的速率r往桶里面填充,直到达到桶的容量,多余的token会

被丢弃。每当一个请求过来时,就会尝试着移除一个token,如果没有token,请求无法通过。

public class TokenBucketDemo {
public long timeStamp = getNowTime();
public int capacity; // 桶的容量
public int rate; // 令牌放入速度
public int tokens; // 当前令牌数量
public boolean grant() {
long now = getNowTime();
// 先添加令牌
tokens = min(capacity, tokens + (now - timeStamp) * rate);
timeStamp = now;
if (tokens < 1) {
// 若不到1个令牌,则拒绝
return false;
}
else {
// 还有令牌,领取令牌
tokens -= 1;
return true;
}
}
}
文章出自:接口限流算法总结

接口限流算法(关于临界点处理)相关推荐

  1. 接口限流算法:漏桶算法amp;令牌桶算法

    转载自 接口限流算法:漏桶算法&令牌桶算法 背景 每一个对外提供的API接口都是需要做流量控制的,不然会导致系统直接崩溃.很简单的例子,和保险丝的原理一样,如果用电符合超载就会烧断保险丝断掉电 ...

  2. 接口限流算法及解决方案

    参考: 接口限流算法:漏桶算法&令牌桶算法 文章目录 一.限流算法 1. 漏桶算法 2. 令牌桶算法 二.令牌桶算法VS漏桶算法 三.解决方案 1. 使用Guava的RateLimiter进行 ...

  3. 滑动窗口限流 java_Spring Boot 的接口限流算法优缺点深度分析

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 上一篇:这300G的Java资料是我师傅当年给我的,免费分享给大家(已修复) 下一篇:昨天分享资料不小心把百度网盘深处 ...

  4. 接口限流算法有哪些??

    点击上方「蓝字」关注我们 0x01:限流 限流顾名思义,提前对各个类型的请求设置最高的QPS阈值,若高于设置的阈值则对该请求直接返回,不再调用后续资源.限流需要结合压力测等,了解系统的最高水位,也是在 ...

  5. 接口限流算法:漏桶算法令牌桶算法

    工作中对外提供的API 接口设计都要考虑限流,如果不考虑限流,会成系统的连锁反应,轻者响应缓慢,重者系统宕机,整个业务线崩溃,如何应对这种情况呢,我们可以对请求进行引流或者直接拒绝等操作,保持系统的可 ...

  6. Java接口限流算法

    0. 前言 常见的限流算法有:令牌桶.漏桶.计数器也可以进行粗暴限流实现. 1. 算法介绍 1.1 令牌桶算法 令牌桶算法是一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌.令牌桶算法的描述如下: ...

  7. 接口限流算法:漏桶算法令牌桶算法。

    背景 每一个对外提供的API接口都是需要做流量控制的,不然会导致系统直接崩溃.很简单的例子,和保险丝的原理一样,如果用电符合超载就会烧断保险丝断掉电源以达到保护的作用.API限流的意义也是如此,如果A ...

  8. Spring Boot 的接口限流算法优缺点深度分析

  9. 微服务接口限流的设计与思考(附GitHub框架源码)

    http://www.infoq.com/cn/articles/microservice-interface-rate-limit?useSponsorshipSuggestions=true&am ...

  10. 使用令牌桶算法解决调用第三方接口限流问题

    我们在调用第三方接口时常常会碰到接口限流问题,为了解决这一问题,大家想出了许多方法.我这里介绍一下我的方法,第三方接口限流一般是基于令牌桶算法的,那么我们可以以彼之道还治彼身,使用令牌桶算法实现我方调 ...

最新文章

  1. 中通知设置响铃_iOS 13.1.3 正式版:解决来电不响铃问题
  2. linux中将文本中的单词换掉的指令_为什么说从PDF中提取文本是一件困难的事?...
  3. ML/DL之激活函数/求导函数:ML中常用的AF激活函数(step_function、sigmoid、softmax、ReLU等)求导函数等代码实现之详细攻略
  4. js 原型prototype继承模式
  5. abap al设置单元格可编辑 oo_excel表格操作: 图形和图表编辑技巧汇总(二)
  6. 使用 Hyper-v 虚拟化域控制器
  7. 《Linux编程》学习笔记 ·002【Linux常用工具GCC、GDB、Make】
  8. C语言中的main函数为什么被称作程序入口
  9. BZOJ35453551[ONTAK2010]Peaks——kruskal重构树+主席树+dfs序+树上倍增
  10. 一图理解ceil和floor的区别
  11. w3cschool实战答案
  12. 一场无名的宿醉,失措了一夜的安然。
  13. VMware 12 安装 macOS S 10.12
  14. switch default多次触发
  15. 使用VirtualBox搭建分布式集群环境记录
  16. GitHub如何从远程库克隆
  17. 计算机 90学时培训总结,90学时培训心得总结
  18. 自然语言处理菜鸟学习笔记(一)
  19. “华数杯”建模学习思考(MatlabPython代码实现)
  20. 计算机毕业设计Java超市会员积分管理系统(源码+系统+mysql数据库+lw文档)

热门文章

  1. 中国护照可以免签的10个旅游天堂国家(地区)
  2. 老毛桃u盘装系统linux,老毛桃U盘PE重装系统教程
  3. 大白菜无法打开计算机硬盘,大白菜pe系统检测不到硬盘怎么办?
  4. mybatis的一级缓存和二级缓存
  5. 电子邮件群发软件,邮件群发单显是什么意思?外贸群发邮件软件
  6. 阿里架构师经验分享!写给即将正在找工作的Java攻城狮,吊打面试官
  7. 【寒江雪】SSL通信详解
  8. 永中java的窗口_永中國際 Office
  9. 批量导出qq群的成员列表
  10. 学校设备保修维修工单小程序开发制作