流量控制是怎么实现的
流量控制通过限制请求速率或资源使用,避免系统过载,保证稳定性和可靠性。常见实现方式包括 限流(如令牌桶、漏桶算法)、队列缓冲、拒绝策略 和 动态调整,具体依赖工具(如 Nginx、Redis)或框架(如 Sentinel、Hystrix)。
关键事实
- 目标:
- 防止流量突增压垮系统(如 DDoS 攻击)。
- 保护下游服务,确保资源合理分配。
- 实现方式:
- 限流算法:
- 令牌桶:按固定速率生成令牌,请求需获取令牌才能通过。
- 漏桶:请求以固定速率流出,超量排队或丢弃。
- 队列:缓冲请求,平滑流量。
- 拒绝:超限请求直接返回错误(如 429 Too Many Requests)。
- 动态调整:根据负载(如 CPU、QPS)调整阈值。
- 限流算法:
- 常见工具:
- Nginx:配置请求速率限制。
- Redis:分布式计数器实现限流。
- Sentinel:微服务流量控制,支持多种策略。
延伸与面试角度
- 网络流量控制:
- TCP 滑动窗口:根据接收方容量调整发送速率。
- HTTP/2 流控制:每个流有窗口大小。
- 微服务场景:
- Sentinel:支持 QPS、线程数限流,动态规则。
- Hystrix:熔断 + 限流,防止级联失败。
- 动态调整:
- 根据 CPU/内存使用率调整阈值(如 Netflix 的自适应限流)。
- 优缺点:
- 令牌桶:支持突发流量,灵活。
- 漏桶:流量平滑,但不适应突增。
- 实际应用:
- 电商秒杀:Redis 令牌桶限流。
- API 网关:Nginx 控制访问速率。