PmHub实现Redis加Lua脚本基于计数器算法的限流(👍必看)
你好,欢迎来到面试系列!这篇文章主要讲在 PmHub 中如何通过Redis加Lua脚本实现基于计数器算法的限流,先讲了一些关于限流和 Redis 的基础,后面有具体的项目实战,我们还加了面试题方便你快速掌握。这是面试加分项和亮点,必须掌握哦!
以下描述你可以直接写进简历,也可以根据你的理解进行优化。
- 通过结合 Redis和 Lua 脚本,实现了基于计算器算法的限流方式。
本教程大纲:
限流重要性
保护高并发服务稳定主要有三大法宝:缓存、降级和限流。
● 缓存:缓存是一种提高数据读取性能的技术,通过在内存中存储经常访问的数据,可以减少对数据库或其他存储系统的访问,从而提升系统的响应速度。缓存可以应用在多个层面,例如浏览器缓存、CDN 缓存、反向代理缓存和应用缓存等。
● 降级:在系统压力过大或部分服务不可用时,降级可以暂时关闭一些非核心服务,以保证核心服务的正常运行。降级可以在多个层面进行,例如页面降级、功能降级和服务降级等。
● 限流:限流是一种控制系统处理请求速率的技术,以防止系统过载。限流可以通过多种算法实现,例如令牌桶算法和漏桶算法等。
这三大法宝各有其特点,通常会结合使用,以达到最佳效果。例如,可以通过缓存减少对数据库的访问,通过降级应对系统故障,通过限流防止系统过载。在设计高并发系统时,需要根据系统的具体需求和特点,合理使用这些技术。接下来,我们来重点讲一讲限流。
想象一下你开了一家非常受欢迎的餐馆,每天都有很多顾客来就餐,但餐馆的座位和服务员数量是有限的。为了确保每位顾客都能得到良好的服务,你需要控制在餐馆内同时用餐的人数。这就是限流。
限流是一种技术手段,用来限制某个系统或服务在单位时间内处理的请求数量,以确保系统能够正常运行,不会因为超负荷而崩溃。
在限流中有 2 个概念需要了解:
- 阈值: 阈值是指在单位时间内允许的最大请求数量。例如,如果将每秒请求数(QPS)限制为500,这意味着系统在1秒内最多只能处理500个请求。通过设置这样的阈值,可以控制系统的负载,防止系统因为处理过多请求而出现问题。
- 拒绝策略: 拒绝策略是指当请求数量超过设定的阈值时,系统如何处理这些额外的请求。常见的拒绝策略有: ○ 直接拒绝:系统立即拒绝超过阈值的请求,不予处理。 ○ 排队等待:将超过阈值的请求放入队列,按照一定规则依次处理。
选择合适的拒绝策略,可以在保持系统稳定的同时,尽量减少对用户体验的影响。
假设你的餐馆有10张桌子,每张桌子只能容纳4人。你设定的阈值是每小时最多接待40位顾客(即10张桌子的总座位数)。如果超过这个数量,有两种处理方式:
- 直接拒绝:告诉超过40位的顾客暂时不能接待,请稍后再来。
- 排队等待:让超过40位的顾客在餐馆外面排队,等有空位时再依次入座。
通过这种方式,你可以确保每位顾客都能享受到良好的服务,而不会因为餐馆超负荷而导致服务质量下降。
限流是通过设定阈值和选择拒绝策略,来控制系统处理请求的数量,确保系统在高负载情况下仍然能够稳定运行的一种关键技术手段。根据具体需求,限流可以分为单机限流和分布式限流,不同的算法(如固定窗口、滑动窗口、漏桶、计算器算法和令牌桶)可以应用于不同的限流场景。
目前有两个比较主流的限流方案:
- 网关层限流。将限流规则应用在所有流量的入口处
- 中间件限流。将限流信息存储在分布式环境中某个中间件里(比如redis),每个组件都可以从这里获取到当前时间的流量统计,从而决定是否放行还是拒绝。
在整个系统层面,我们采用的是 Gateway 配合 Sentinel 的方式进行限流,但因为登录接口比较特殊,一来会绕过网关认证逻辑,二来容易被刷,所以在登录接口上我们又增加了自定义 Redis+Lua 的限流方式。