集群并发请求限制

1.功能描述

  • 能够对njet 集群实现 http请求速率限制

  • 实现可认为是limit_req_zone 以及limit_req指令的集合体,两个指令合在一起的功能,也就是说zone的配置和连接数的设置在同一个指令完成

  • 限制功能与limit req功能一致

2.依赖模块

njet.conf:

load_module modules/njt_http_cluster_limit_req_module.so;

3.指令说明

3.1 cluster_limit_req_dry_run

  • 功能: 如果配置为on,实际不限制,但是会仍然记录请求数; 如果配置为off,则会受limit_req限制
Syntax: cluster_limit_req_dry_run on | off;
Default: cluster_limit_req_dry_run off;
Context: http, server, location

3.2 cluster_limit_req_log_level

  • 功能: 达到限制时日志打印级别
Syntax: cluster_limit_req_log_level info | notice | warn | error;
Default: cluster_limit_req_log_level notice;
Context: http, server, location

3.3 cluster_limit_req_status

  • 功能: 达到限制后返回的状态码,默认是503
Syntax: cluster_limit_req_status code;
Default: cluster_limit_req_status 503;
Context: http, server, location

3.4 cluster_limit_req

  • 功能:http请求速率限制
Syntax: cluster_limit_req $binary_remote_addr zone=cluster2:10m rate=100;;
Default:
Context: http, server, location

4.配置样例

...
load_module  modules/njt_http_cluster_limit_req_module.so;
...


stream {
        server {
                listen 238.255.253.254:5555 udp;
                gossip zone=test:1m heartbeat_timeout=100ms nodeclean_timeout=1s;
        }
}

 http {
   #http层
   cluster_limit_req $binary_remote_addr zone=cluster_http_10:10m rate=10;
   upstream back{
                server 127.0.0.1:8008;         
                server 127.0.0.1:8009; 
   }
   server {
        #server层
        cluster_limit_req $binary_remote_addr zone=cluster_server_25:10m rate=25;
        listen 8186; 
        location / {
                proxy_pass http://back;
        }
   }

   server {
        listen 9186;     
        location / { 
                #location层
                cluster_limit_req $binary_remote_addr zone=cluster_location_66:10m rate=66;
                proxy_pass http://back;
        }
   }
}

5.测试样例

1. 只测试单节点,节点请求速率为100r/s 左右,30s应该为3000个请求左右

[root@localhost clb]# ./wrk2 -t 1 -c 10  -d 30s -R 400 http://192.168.40.136:80/
Running 30s test @ http://192.168.40.136:80/
  1 threads and 10 connections
  Thread calibration: mean lat.: 1.299ms, rate sampling interval: 10ms
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.40ms    1.30ms  21.06ms   95.81%
    Req/Sec   420.82     84.30     1.00k    81.75%
  11996 requests in 30.00s, 5.74MB read
  Non-2xx or 3xx responses: 8896
Requests/sec:    399.85
Transfer/sec:    195.91KB
[root@localhost clb]# 

上面的测试中30s 内共发送11996个请求,8896个请求失败,成功数=(11996-8896)= 3100, 符合100r/s 设定

2.两个节点同时并发测试,设置请求速率为100r/s左右,30s两个节点一共请求应该为3000左右

  • 136节点:
[root@localhost clb]# ./wrk2 -t 1 -c 10  -d 30s -R 400 http://192.168.40.136:80/
Running 30s test @ http://192.168.40.136:80/
  1 threads and 10 connections
  Thread calibration: mean lat.: 1.111ms, rate sampling interval: 10ms
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.17ms    1.05ms  12.83ms   94.79%
    Req/Sec   426.90     80.14     0.89k    81.71%
  11996 requests in 30.00s, 4.97MB read
  Non-2xx or 3xx responses: 10514
Requests/sec:    399.85
Transfer/sec:    169.47KB
  • 157节点:
[root@localhost clb]# ./wrk2 -t 1 -c 10  -d 30s -R 400 http://192.168.40.157:8003/
Running 30s test @ http://192.168.40.157:8003/
  1 threads and 10 connections
  Thread calibration: mean lat.: 1.156ms, rate sampling interval: 10ms
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.20ms    0.92ms  14.04ms   93.46%
    Req/Sec   424.76     71.28     0.89k    82.15%
  11996 requests in 30.00s, 5.04MB read
  Non-2xx or 3xx responses: 10361
Requests/sec:    399.85
Transfer/sec:    171.92KB