限流的必要性
- 系统或服务存在处理能力的极限,流量过大可能导致系统卡死、崩溃或不可用。
- 限流作为预防性措施,确保系统整体服务可用性。
常用的限流算法
1. 令牌桶算法(Token Bucket Algorithm)
- 核心思路:系统以固定速度往桶里添加令牌,请求到来时需消耗令牌,无令牌则拒绝服务。
- 特点 :
- 桶容量固定,代表系统处理能力阈值。
- 令牌添加速度固定。
- 请求处理速度取决于实际请求量,每个请求消耗一个令牌。
- 桶空时,请求等待或被拒绝。
- 应用示例:Java中的Guava RateLimiter。
2. 漏桶算法(Leaky Bucket Algorithm)
- 核心思路:请求如水进入漏桶,以固定速度流出,桶满则溢出,拒绝新请求。
- 特点 :
- 桶容量固定。
- 流入速度随意。
- 流出速度固定。
- 桶满溢出,即拒绝新请求。
3. 计数器算法
- 用于限制总并发数,通过计数器累计请求次数,达到阈值触发拒绝策略。
- 每过一定时间,计数器重置。
4. 滑动窗口算法
- 基于固定时间窗口,统计请求量,设定阈值控制流量。
- 示例:TCP协议使用。
5. Redis + Lua分布式限流
- 利用Lua在Redis中的原子性保证限流操作的一致性。
- 示例:Lua脚本实现限流逻辑。
三方工具
resilience4j
- 轻量级容错库,提供限流、熔断、重试等功能。
- 易于与Spring Boot集成。
Sentinel
- 阿里巴巴开源的流量防护框架,提供限流、熔断、系统负载保护等功能。
- 与Spring Cloud深度集成。
总结
- 限流方式多样,包括计数器、滑动窗口、漏桶、令牌桶、Redis + Lua分布式限流等。
- 限流场景和维度多样,如URL、IP地址、设备ID、用户ID等。
- 需要结合真实业务场景灵活使用限流方案。