限流
- 使用场景
- 固定窗口限流
- 滑动窗口限流
- 漏桶算法
- 令牌桶
使用场景
- 控制成本:限制用户调用总次数。
- 保护服务:用户在短时间内疯狂使用,导致服务器资源被占满,其他用户无法使用。
思考限流阈值多大合适?参考正常用户的使用,比如限制单个用户在每秒只能使用1次。
单机限流实现
- Guava RateLimiter
多机限流实现
- Redisson
固定窗口限流
将单个时间段
作为一个窗口,每个窗口会限制请求的次数。如果请求的次数大于阈值后,则拒绝请求。
缺点:
临界问题:如果在上一个窗口的末尾发送了许多的请求,并且在当前窗口的开始也发送了许多的请求,则有可能当前系统的请求数超过阈值。
滑动窗口限流
将单个时间段又划分成多个小的周期
,比如:1s 可以分成 5 个 0.2s 的小周期。每经过 0.2s 则向右滑动窗口。解决了固定窗口的临界问题。
缺点:
实现相对复杂,而且滑动单位不好选取。
漏桶算法
类似于漏斗注水滴水。以任意速率注入水,以固定速率滴水。如果超出了当前的容量则拒绝。
缺点:
只能按固定速率一个一个处理请求。
令牌桶
按固定速率生成令牌,并将其加入到桶中。如果桶已满,生成的令牌将被丢弃。
当一个请求到达时,检查桶中是否有足够的令牌。如果有,则从桶中移除相应数量的令牌,允许请求通过;否则,拒绝请求或将其排队等待。