目录

服务限流的通用方案

服务限流的通用方案

服务限流场景

限流常见使用层面:

  • 用户网络层:突发的流量场景如热点事件流量,恶意刷流,竞对爬虫等;

  • 内部应用层:上游服务的异常调用,脚本异常请求,失败重试策略造成的流量突发;

实现方式

以下实现方式的代码示例参考:repo地址

计数器

比较常见且简单的方式即为计数器方式,使用某一公共存储变量进行计数,需要注意的是在计数时保证原子性。

  • 使用场景:适用于做API限流或者根据IP做粒度控制等;

  • 局限:由于计数一般为定速所以对于更细粒度时间控制能力较为有限;

漏斗桶限流

https://img.zhengyua.cn/20210208203828.png

漏斗桶核心在于它是匀速的,当桶满了,新流量过来就会被限流。

  • 使用场景:与计数器限流相比限流过后的流量还有机会流入而不是直接舍弃,适合于频率控制操作;

  • 局限:若短时有大量突发请求即使负载压力不大,但请求仍需要在队列处等待处理;

令牌桶限流

https://img.zhengyua.cn/20210208214244.png

令牌桶相对于漏斗桶控制时间粒度和应对突然流量的能力更加优秀。通过匀速往桶里放令牌,控制桶最大容量和放入令牌速率。请求若拿到了令牌则可以通过,反之则被限流。而令牌是可以积累的,说明能够应对流量不同大小的场景。

  • 使用场景:应用较为广泛,如java中的guava就有实现;

参考

分布式高并发服务限流实现方案