为什么限流
运营网站,经常会遇到各种挑战:某黑客发起DoS攻击、网络爬虫网页抓取、商品秒杀活动、双十一与618等场景,会使流量突然激增,如果不限制流量的访问就会使系统宕机。
常见的限流算法
1.漏桶算法( LEAKY BUCKET)
漏桶算法创造一个固定容量的队列(漏桶),每个请求就像一滴水,到来后会先存储在漏桶里面。漏桶的底部有个破洞,水低落下来的速率就是限流的阈值。当漏桶容量已满时,后续的请求会溢出(拒绝或者延迟处理)。
优点:可以平滑的控制流量的进出,保证系统的安全性与稳定性。
缺点:漏桶算法无法应付突然激增的流量,如果流量突增,因为算法本身的限制,只能按照固定的速度去处理请求。
2.令牌桶算法(Token Bucket)
令牌桶算法类似上面的漏桶算法,它相当于有个管理员按照限流的大小,定速地向令牌桶扔令牌。所有的请求都会从令牌桶获取令牌,获取成功处理请求逻辑,获取失败拒绝访问。令牌桶满了后,多余的令牌会丢弃。
优点:令牌桶算法是针对漏桶算法的优化,能够应对突增的流量。
我们可以使用Guava的RateLimiter来实现令牌
3.计数器算法
最简单的一种限流算法,我们可以通过原子操作类累积一秒内的请求次数,如果超过设定阈值,拒绝请求访问。
优点:实现简单,单机模式下用Atomic类来实现,分布式下使用Redis就可以实现
缺点:只能进行简单的控制请求速率,无法做到精准的控制,无法应对突发的流量增长