限流目的
限流是为保护自身系统和下游系统不被高并发流量冲垮,导致系统雪崩等问题。
在保证系统可用的情况下尽可能多增加进入的请求,其余的请求在排队等待,或者返回友好提示,保证里面进入系统的用户可以正常使用,防止系统雪崩。
令牌桶
指定令牌桶的容量并以固定速率往令牌桶放置令牌,客户端请求时,首先查询令牌桶内的令牌数,若大于0则取出一个令牌,服务端正常处理客户端请求,否则服务端拒绝服务。
此外,如果令牌放置的速度比客户端请求的速度要快,令牌桶的令牌会一直增加直到令牌占满整个令牌桶。
漏桶
指定漏桶容量,同时漏桶会以一定速率放行客户端请求,当桶内请求数量累计数量大于桶容量时,请求被拒绝。
令牌桶和漏桶的区别
令牌桶
1. 令牌桶令牌数量是按照指定速率增加的;
2. 令牌桶的容量是固定的,但放行(处理请求)的速度不是固定的,理论上支持的最大并发量就是桶内的容量;
3. 系统的负载能力应该与令牌桶的容量以及放置令牌的速率相关;
漏桶
1. 客户端请求以任意速率进入漏桶;
2. 漏桶的容量是固定的,放行(处理请求)的速率也是固定的;
3. 系统的负载能力应该与漏桶的放行速率相关;
总之,令牌桶在限制请求平均处理速率的基础上还允许突发的流量增加,而漏桶有更强的削峰能力,可以强制限制请求处理的速率,但漏桶出口的速度固定,因为计算性能固定,不能灵活的应对服务动态扩容的场景
计数器算法
计数器算法是在一段时间间隔内(时间窗/时间区间),处理请求的最大数量固定,超过部分不做处理。
例如:限制接口A在单位时间T内的访问次数不能超过X个。
- 在每个单位时间T开始时,设置一个计数器counter,每有一个请求,counter就加1,如果counter的值小于X则放行请求,否则拒绝服务;
- 每个单位时间T结束时,重置counter。
计数器算法存在的临界问题
如果在单位时间T的结束之前的一小段时间和下一个单位时间T开始之后的一小段时间内出现突发流量,理论上系统最大会承载2X个请求,此时流量速率是可能远大于限制的;