后端服务之接口流量控制

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