限流及熔断的场景?
限流(Rate Limiting)和熔断(Circuit Breaker)是高并发系统中常见的保护机制,用于防止系统过载和提高稳定性。它们适用于不同的场景:
限流(Rate Limiting)适用场景
限流主要用于控制请求速率,防止系统因突发流量或恶意请求导致资源耗尽。
1. API 接口防刷
- 场景:防止恶意用户短时间内大量请求 API,导致服务崩溃。
- 解决方案:使用 令牌桶 或 漏桶算法 进行限流,例如:
- 单个用户每秒最多调用 10 次 API。
- 访客用户限制 5 次/分钟,VIP 用户 100 次/分钟。
2. 限制某个资源的访问速率
- 场景:某些高价值资源(如数据库、缓存)的访问需要控制频率,防止系统负载过高。
- 解决方案:对数据库查询、Redis 操作等进行限流,如:
- 业务接口每秒最多访问数据库 1000 次。
- 热点缓存(Redis)访问频率控制在 5000 QPS。
3. 保护后端服务
- 场景:前端应用请求量过大,导致后端服务器无法承受。
- 解决方案:在 Nginx、API 网关(如 Kong、Envoy)或应用层限流,如:
- Nginx 限流配置
limit_req_zone
限制 QPS。 - API 网关(如 go-zero)实现全局限流或单用户限流。
- Nginx 限流配置
4. 防止消息队列过载
- 场景:短时间内生产者写入大量消息,导致 Kafka/RabbitMQ 等消息队列崩溃。
- 解决方案:对生产者进行限流,确保消息写入速率可控,如:
- 限制单个生产者每秒最多发送 500 条消息。
熔断(Circuit Breaker)适用场景
熔断主要用于防止级联故障,当某个服务出现异常时,短时间内拒绝请求,等待恢复。
1. 依赖服务异常
- 场景:A 服务调用 B 服务,B 服务宕机或响应变慢,导致 A 也被拖垮。
- 解决方案:使用熔断机制,如 Netflix Hystrix 或 go-zero 的
Breakers
:- B 服务 1s 内失败率 > 50%,触发熔断,A 不再请求 B。
- 经过 10s,尝试小流量请求 B,若恢复则解除熔断。
2. 处理高延迟请求
- 场景:外部接口(如第三方支付、物流)由于网络问题响应变慢,影响整体服务。
- 解决方案:
- 设定超时时间,避免请求长时间阻塞(如 2s 超时)。
- 超时失败次数超过阈值(如 5 次/分钟),触发熔断。
3. 预防数据库过载
- 场景:数据库查询耗时过长,导致连接池耗尽,影响整个服务。
- 解决方案:
- 监控数据库查询超时率,达到一定比例触发熔断,短时间内拒绝查询。
- 结合限流,降低高并发请求对数据库的影响。
4. 保护缓存服务(Redis/Memcached)
- 场景:Redis 宕机或变慢时,请求回退到数据库,导致数据库压力剧增。
- 解决方案:
- 触发熔断后,直接返回默认值或降级策略,避免回源数据库。
总结
机制 | 作用 | 适用场景 |
---|---|---|
限流 | 限制请求速率,防止资源耗尽 | API 防刷、数据库保护、缓存保护、MQ 限流 |
熔断 | 防止级联故障,避免服务雪崩 | 依赖服务异常、外部 API 高延迟、数据库/缓存过载 |