限流和熔断虽然都是为了保障系统的可用性,但它们解决的问题视角不同。
核心对比
| 维度 | 限流 (Rate Limiting) | 熔断 (Circuit Breaking) |
|---|---|---|
| 侧重点 | 防止流量过载,保护本服务 | 防止故障蔓延,保护下游服务 |
| 判断依据 | 请求的速率/并发量 | 请求的成功率/错误率/超时率 |
| 触发位置 | 通常在系统入口(如网关层) | 通常在系统出口(如 RPC 客户端) |
| 行为 | 拒绝请求、排队等待、丢弃 | 跳闸、快速失败、走降级逻辑 |
两者如何协作?
在实际的生产环境中,限流和熔断通常是配合使用的。以缓存雪崩为例:
- 限流的作用:当 Redis 挂掉导致海量流量直达数据库时,限流在应用层入口拦截掉大部分超负荷请求,确保数据库只处理它能扛住的那部分查询,防止数据库因过载而彻底宕机。
- 熔断的作用:如果数据库因为这突如其来的压力已经响应极慢(甚至部分请求开始报错),熔断机制会检测到超时率过高,直接切断对数据库的访问,防止应用服务器的线程池被堆积的查询请求占满,从而保护应用层自身不挂掉。
总结
- 限流是控制流量的量,确保系统不被“撑死”。
- 熔断是控制调用的质,确保系统不被下游的故障“拖死”。