后端服务之接口流量控制
1. 流控
- 计数器算法计数器算法的思路是限制一个接口在某个维度(IP、用户、某种资源)上的响应次数。通过设置一个计数器,每响应一次,计数器加一,当计数器超过阈值时,拒绝服务。这种算法对总数量进行了简单的限制,而不是平均速率限流。
- 漏桶算法请求以一定速率进入到漏桶中,漏桶以一定速率响应请求,当水流入速度过大时,拒绝服务。
- 令牌桶算法按照固定速率往桶里添加令牌。随着时间流逝,系统会按恒定时间间隔往桶里加入Token,如果桶已经满了,就不再添加。新请求来临时,会各自拿走一个 Token,如果没有 Token 可拿了就阻塞或者拒绝服务

4. 不同类型的限流器
- 请求限流器限制每个用户每秒可发送 N 个请求
- 并发请求限流器限制每秒最高请求数。请求限流器限制的是累积量,而并发限制的是峰值。
- 基于使用量的负载降级将请求分为关键 API 请求和非关键 API 请求。设计系统时,为关键 API 请求预留一定资源,当非关键 API 请求需要占用预留资源时,不预分配,直接拒绝服务。
- 基于 Worker 利用率的负载降级如果某个 worker 太忙,无法处理分配给它的请求,它会缓慢降级非关键请求,当然是先从测试请求开始。如果降低测试请求的过程中,worker 的处理能力恢复到好的状态,那我们就可以开始缓慢地恢复流量。
5. 实现
- https://www.zzxworld.com/blogs/limit-rate-and-connection-in-nginx.html
- https://django-ratelimit.readthedocs.io/en/latest/usage.html
- https://wenchao.ren/archives/234