根据条件,对会话的并发连接数进行控制,保证服务的可用性

令牌桶算法

image.png

算法思想:

  • 令牌以固定的速率产生,并缓存到令牌桶中。()
  • 令牌桶放满时,多余的令牌被丢弃。
  • 请求要消耗等比例的令牌。
  • 令牌不够时,请求被缓存或拒绝。
  1. http {
  2. limit_req_zone $binary_remote_addr zone=aaa:10m rate=2r/s;
  3. ### 第一个参数:$binary_remote_addr 表示通过remote_addr这个标识来做限制,“binary_”的目的是缩写内存占用量,是限制同一客户端ip地址。
  4. ### 第二个参数:zone=one:10m表示生成一个大小为10M,名字为one的内存区域,用来存储访问的频次信息。
  5. ### 第三个参数:rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,还可以有比如30r/m的。
  6. server {
  7. location /path/ {
  8. limit_conn zone=one;
  9. ### burst 设置令牌桶的缓存值数量,应对突发流量。
  10. ### 但是请注意:burst的作用是让多余的请求可以先放到队列里,慢慢处理。如果不加nodelay参数,队列里的请求不会立即处理,而是按照rate设置的速度,以毫秒级精确的速度慢慢处理。
  11. limit_req zone=aaa burst=5 nodelay;
  12. ### 自定义拒绝请求状态码
  13. limit_req_status 598;
  14. }
  15. }
  16. }

漏桶算法

image.png

算法思想:

  • 请求从上方倒入桶中,从桶下方流出被处理。
  • 来不及流出的请求将被缓存在桶中,以固定速率流出;
  • 水桶满后后续的请求将被丢弃;

区别:

  • 漏桶算法能够强行限制数据的实时传输(处理)速率,对突发流量不做额外处理(超桶流量被丢弃)
  • 令牌桶能够在限制数据的评价传输速率的同时允许某种程度的突发传输。

Nginx按请求速率限速模块使用的是漏桶算法,即能够强行保证请求的实时处理速度不会超过设置的阈值。

Nginx官方版本限制IP的连接和并发分别有两个模块:

  • limit_req_zone 用来限制单位时间内的请求数,即速率限制,采用的漏桶算法 “leaky bucket”。
  • limit_req_conn 用来限制同一时间连接数,即并发限制。
  • Nginx的限流统计是基于毫秒的

死磕nginx系列—nginx 限流配置