https://segmentfault.com/a/1190000041141345
考虑两个问题:能否应对突发流量
和能否平滑处理请求
。
-
滑动窗口算法(Sliding Window)
- 优点 能应对突发流量
- 缺点 限流不够平滑。仅能控制时间段内请求总量。
-
漏桶限流算法(Leaky Bucket) 维持一定量的请求空间,以稳定的速度处理请求,当漏斗累积的请求数量超过最大值时开始拒绝请求
- 优点
永远
匀速处理请求
,保证了服务稳定性 - 缺点 无法应对突发流量,由于处理速度恒定,当大量请求到来时,用户等待时间长,用户体验差
- 优点
永远
-
令牌桶算法(Token Bucket) Guava 库中的 RateLimiter 类是对令牌桶算法的单机版实现,基于 RateLimiter 我们可以设置每秒生成的令牌数,并允许以阻塞、尝试,以及超时等策略获取令牌。
令牌桶算法通过令牌来控制请求的处理。系统按照固定速率生成令牌,放入令牌桶中。当有请求到来时,需要先从令牌桶中取出一个令牌,才能被处理。如果令牌桶为空,则请求被限流或进入等待队列。
- 优点
- 可以处理突发流量(预先生成的令牌可以在一瞬间被取走)
- 限制平均处理速率(生成令牌的速率)
- 缺点 几乎没有
- 优点
选择
- 需要时间段内的精确控制:滑动窗口算法(Sliding Window)
- 需要严格控制请求速率,保持稳定:漏桶算法(Leaky Bucket)
- 高并发、需要支持突发流量:令牌桶算法(Token Bucket)