文章目录
1 概述
1.1 什么是限流
限流其实在我们的生活中很常见,例如节假日的热门景区就会通过限售的方式限制景区的容纳游客数量。而在我们的系统服务中,也往往会采取一定措施限制到达系统的并发请求数,使得系统能够正常地处理部分用户的请求,从而保证系统的稳定性。
当然这样的举措不可避免的会造成用户的请求变慢甚至被拒的情况,影响用户体验。因此,限流需要在用户体验和系统稳定性之间做一个平衡。
1.2 什么时候限流
在我们的业务开发中,以下场景往往需要通过限流以保证我们系统的稳定性:
- 抢购、大促活动或者热点新闻事件等业务场景往往需要限制最大的请求访问量,防止用户流量的突增影响业务的进行;
- 我们对外的数据或文件上传等接口,容易受到爬虫、DDos 等手段的非正常流量攻击,故需要最大恶意的加固服务防止攻击者;
- 系统调用的第三方服务时应注意下游服务的稳定性,通过限制自身的请求量以保护下游服务。
2 限流算法
在我们使用较多的限流算法中,大体上可以分为一下五类**:简单计数器**、固定窗口计数器、滑动窗口计数器、漏桶、令牌桶。
2.1 简单计数器
简单计数器限流顾名思义,应该是最简单的限流算法了 。在我们的服务中维护一下全局计数器,每当接收一个请求时计数器加一,当请求处理完成后,计数器减一。
public boolean tryAcquire() {
if (counter < threshold) {
counter++;
return true;
}
return false;
}
public boolean tryRelease() {
if (counter > 0) {
counter--;
return true;
}
return false;
}
根据计数器存放位置我们又可以分为单机限流(计数器存本地内存)和分布式限流(计数器集中存储,如Redis)。
2.2 固定窗口
固定窗口限流其实也算计数器限流算法的一种,相比简单计数器多了一个时间窗口的概念,计数器每经过一个该时间窗口,就会被重置。
public boolean tryAcquire() {
// 获取当前时间
long now =

文章介绍了限流的基本概念和重要性,以及五种常见的限流算法:简单计数器、固定窗口、滑动窗口、漏桶和令牌桶。其中,令牌桶算法适用于应对流量激增,而漏桶则适合稳定请求速率。文章还探讨了Google的RateLimiter实现,它优化了令牌桶的生成策略,避免过多线程。最后,强调了根据业务场景选择合适限流策略的重要性。
最低0.47元/天 解锁文章
6318

被折叠的 条评论
为什么被折叠?



