1、令牌桶算法和漏桶算法

令牌桶算法

  • 令牌以固定速率产生,并缓存到令牌桶中;
  • 令牌桶放满时,多余的令牌被丢弃;
  • 请求要消耗等比例的令牌才能被处理;
  • 令牌不够时,请求被缓存。

六.Nginx限流熔断 - 图1

漏桶算法

  • 水(请求)从上方倒入水桶,从水桶下方流出(被处理);
  • 来不及流出的水存在水桶中(缓冲),以固定速率流出;
  • 水桶满后水溢出(丢弃)。
  • 这个算法的核心是:缓存请求、匀速处理、多余的请求直接丢弃。 相比漏桶算法,令牌桶算法不同之处在于它不但有一只“桶”,还有个队列,这个桶是用来存放令牌的,队列才是用来存放请求的。

六.Nginx限流熔断 - 图2

2、Nginx熔断限流配置模块

从作用上来说,漏桶和令牌桶算法最明显的区别就是是否允许突发流量(burst)的处理,漏桶算法能够强行限制数据的实时传输(处理)速率,对突发流量不做额外处理;而令牌桶算法能够在限制数据的平均传输速率的同时允许某种程度的突发传输。 Nginx的限流主要是两种方式: ①限制并发连接数(ngx_http_limit_conn_module)。 ②限制访问频率(ngx_http_limit_req_module),基于漏桶算法。

3、Nginx熔断限流-限制并发连接数

官方链接:https://www.nginx.cn/doc/standard/httplimitzone.html 配置文件如下:

  1. limit_conn_zone $binary_remote_addr zone=perip:10m;
  2. limit_conn_zone $server_name zone=perserver:10m;
  3. server {
  4. ...
  5. limit_conn perip 10;
  6. limit_conn perserver 100;
  7. }

limit_conn perip 10 作用的key 是 $binary_remote_addr,表示限制单个IP同时最多能持有10个连接。 limit_conn perserver 100 作用的key是 $server_name,表示虚拟主机(server) 同时能处理并发连接的总数。 需要注意的是:只有当 request header 被后端server处理后,这个连接才进行计数。

4、Nginx熔断限流-限制访问频率

官方链接:https://www.nginx.cn/doc/standard/httplimitrequest.html

①http模块下添加:

  1. limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=10r/s;
  • 命令语法:limit_req_zone key zone rate
  • key:定义限流对象, binaryremote_addr,是基于 remote_addr(客户端IP) 来做限流,binary 开头的目的是压缩内存占用量。
  • zone: 定义共享内存区来存储访问信息, ip_limit:10m表示一个大小为10M,名字为ip_limit的内存区域。1M能存储16000 IP地址的访问信息,10M可以存储16W IP地址访问信息。
  • rate: 用于设置最大访问速率,rate=10r/s 表示每秒最多处理10个请求。Nginx 实际上以毫秒为粒度来跟踪请求信息,因此 10r/s 实际上是限制:每100毫秒处理两个请求。这意味着,自上一个请求处理完后,若后续100毫秒内又有请求到达,将拒绝处理该请求。

②location模块下添加

  1. limit_req zone=ip_limit burst=15 nodelay;
  • zone=ip_limit对应上面的限流对象地址;
  • bursrt=15表示最大支持15的并发,会有5个请求存在队列中,不会被拒绝;
  • nodelay: 表示并发超出的5个请求,不会被延迟,会被立即执行,如需等待执行的话,配置delay即可。

③使用Jmeter测试,我们会发现,超出配置范围内的请求,不会通过。

image.png