
速率限制 (Rate Limit) 通过限制调用 API 的频率防止 API 过度使用,保护 API 免受意外或恶意的使用,在诸多业务场景中得到广泛应用。日前,又拍云系统开发工程师陈卓受邀在 Open Talk 公开课上作了题为《又拍云网关速率限制实践》的分享,详细解读当前常用的算法以及基于网关 nginx/openresty 的实现和配置细节。以下是直播分享内容整理,查看视频请点击阅读原文。
网关速率限制是一种防御服务性措施,公共服务需要借其保护自己免受过度使用,使用速率限制主要有三个好处:
-
提升用户体验:用户在使用公共服务时总会面临一些资源增强和共享的问题,例如 CPU,当一个用户不管是有意或无意地过度使用 API 时,势必会对其他的用户造成一些影响。
-
更加安全:我们的服务、CPU、内存其实都是有一定的限制,过度访问势必会影响到服务的稳定性。假如有四个服务,每个服务能承载 100 个请求,当其中一个服务超过 100 个请求时就可能会宕机,其它三个服务在接收到超过 100 个服务请求时,也会接着连续宕机,这会造成服务不可用。
-
减少开销:现在很多服务都是放到公有云上,内存、CPU 和流量都是有成本的,有一些按量计费,使用多少花多少钱,这种情况会产生一些不必要的开销。
RateLimit 的几种算法
首先介绍四种速率限制的算法,分别是漏桶(Leaky Bucket)、令牌桶(Token Bucket)、固定窗口(Fixed Windows)、滑动窗口(Sliding Windows),很多限制措施都是基于这些算法进行的。漏桶和令牌桶虽然直观理解看似不太一样,但是在底层实现中这两种算法非常相似,达到的效果差不多。固定窗口和滑动窗口属于另外一类,滑动窗口是基于固定窗口做的。
漏桶(Leaky Bucket)

如上图所示,用户请求都被放进桶里,当桶满了以后,请求会被拒绝掉。桶的底部有一个孔,请求会以一定的速率被放过,比如说现在是限制每分钟 10 个请求,意味着每隔 6 秒钟就会有一个请求通过。漏桶算法的特点在于其通过请求的速率是恒定的,可以将流量整形的非常均匀,即便同时有 100 个请求也不会一次性通过,而是按一定间隔慢慢放行,这对后端服务迎接突发流量非常友好。
令牌桶(Token Bucket)

令牌桶,顾名思义桶里放的是一些令牌,这些令牌会按一定的速率往桶里放,假如每分钟限制 10 个请求,那么每分钟就往桶里放 10 个令牌,请求进来的时候需要先在令牌桶里拿令牌,拿到令牌则请求被放行,桶为空拿不到则意味着该请求被拒绝掉。
需要说明的是,令牌的个数是按一定的速率投放的,每分钟放 10 个令牌,那么能通过的请求肯定也是每分钟 10 个。假如匀速放令牌, 6 秒钟放一个令牌,最终结果和每分钟放 10 个令牌是一样的。
漏桶(Leaky Bucket)算法实现
由于令牌桶跟

本文介绍了速率限制(Rate Limit)在API保护中的重要性,包括提升用户体验、保障服务安全和减少开销三个方面。文章详细讲解了四种常见的速率限制算法:漏桶、令牌桶、固定窗口和滑动窗口,并探讨了它们的实现细节和优缺点。特别是漏桶算法的实现,包括如何处理突发流量和使用burst参数。此外,文章还提到了分布式环境下的Rate Limit挑战及性能优化策略,如定时同步和使用缓存减少数据库交互。最后,文中提到了Kong和Cloudflare等公司在实际应用中的解决方案。
最低0.47元/天 解锁文章
2069

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



