NGINX conf:
# limit_req_zone $request_uri zone=per_uri_2s:10m rate=30r/m;
limit_req_zone $limit_post zone=per_uri:10m rate=30r/m;
limit_req_status 429;
location ~ ^/v\d+/tasks/.*/claim$ {
limit_req zone=per_uri_2s;
[...]
}
map $request_method $limit_post {
default "";
POST $request_uri;
}
Testing with wrk:
$ wrk -t2 -c2 -d1s http://api.getzero.ai.0.0.0.0.nip.io/v1/tasks/:id/claim
Running 1s test @ http://api.getzero.ai.0.0.0.0.nip.io/v1/tasks/:id/claim
2 threads and 2 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 0.92ms 0.91ms 11.36ms 93.77%
Req/Sec 1.25k 233.71 1.60k 68.18%
2737 requests in 1.10s, 1.02MB read
Non-2xx or 3xx responses: 2736
Requests/sec: 2484.99
Transfer/sec: 0.93MB
zero-nginx | 172.18.0.1 - - [12/Oct/2017:02:37:32 +0000] "GET /v1/tasks/:id/claim HTTP/1.1" 202 170 "-" "-"
zero-nginx | 172.18.0.1 - - [12/Oct/2017:02:37:32 +0000] "GET /v1/tasks/:id/claim HTTP/1.1" 429 214 "-" "-"
zero-nginx | 172.18.0.1 - - [12/Oct/2017:02:37:32 +0000] "GET /v1/tasks/:id/claim HTTP/1.1" 429 214 "-" "-"
zero-nginx | 172.18.0.1 - - [12/Oct/2017:02:37:32 +0000] "GET /v1/tasks/:id/claim HTTP/1.1" 429 214 "-" "-"
zero-nginx | 172.18.0.1 - - [12/Oct/2017:02:37:32 +0000] "GET /v1/tasks/:id/claim HTTP/1.1" 429 214 "-" "-"
zero-nginx | 172.18.0.1 - - [12/Oct/2017:02:37:32 +0000] "GET /v1/tasks/:id/claim HTTP/1.1" 429 214 "-" "-"
zero-nginx | 172.18.0.1 - - [12/Oct/2017:02:37:32 +0000] "GET /v1/tasks/:id/claim HTTP/1.1" 429 214 "-" "-"
zero-nginx | 172.18.0.1 - - [12/Oct/2017:02:37:32 +0000] "GET /v1/tasks/:id/claim HTTP/1.1" 429 214 "-" "-"
zero-nginx | 172.18.0.1 - - [12/Oct/2017:02:37:32 +0000] "GET /v1/tasks/:id/claim HTTP/1.1" 429 214 "-" "-"
zero-nginx | 172.18.0.1 - - [12/Oct/2017:02:37:32 +0000] "GET /v1/tasks/:id/claim HTTP/1.1" 429 214 "-" "-"
zero-nginx | 172.18.0.1 - - [12/Oct/2017:02:37:32 +0000] "GET /v1/tasks/:id/claim HTTP/1.1" 429 214 "-" "-"
zero-nginx | 172.18.0.1 - - [12/Oct/2017:02:37:32 +0000] "GET /v1/tasks/:id/claim HTTP/1.1" 429 214 "-" "-"
zero-nginx | 172.18.0.1 - - [12/Oct/2017:02:37:32 +0000] "GET /v1/tasks/:id/claim HTTP/1.1" 429 214 "-" "-"
zero-nginx | 172.18.0.1 - - [12/Oct/2017:02:37:32 +0000] "GET /v1/tasks/:id/claim HTTP/1.1" 429 214 "-" "-"
zero-nginx | 172.18.0.1 - - [12/Oct/2017:02:37:32 +0000] "GET /v1/tasks/:id/claim HTTP/1.1" 429 214 "-" "-"
zero-nginx | 172.18.0.1 - - [12/Oct/2017:02:37:32 +0000] "GET /v1/tasks/:id/claim HTTP/1.1" 429 214 "-" "-"
zero-nginx | 172.18.0.1 - - [12/Oct/2017:02:37:32 +0000] "GET /v1/tasks/:id/claim HTTP/1.1" 429 214 "-" "-"
zero-nginx | 172.18.0.1 - - [12/Oct/2017:02:37:32 +0000] "GET /v1/tasks/:id/claim HTTP/1.1" 429 214 "-" "-"
zero-nginx | 172.18.0.1 - - [12/Oct/2017:02:37:32 +0000] "GET /v1/tasks/:id/claim HTTP/1.1" 429 214 "-" "-"
zero-nginx | 172.18.0.1 - - [12/Oct/2017:02:37:32 +0000] "GET /v1/tasks/:id/claim HTTP/1.1" 429 214 "-" "-"
zero-nginx | 172.18.0.1 - - [12/Oct/2017:02:37:32 +0000] "GET /v1/tasks/:id/claim HTTP/1.1" 429 214 "-" "-"
zero-nginx | 172.18.0.1 - - [12/Oct/2017:02:37:32 +0000] "GET /v1/tasks/:id/claim HTTP/1.1" 429 214 "-" "-"
zero-nginx | 172.18.0.1 - - [12/Oct/2017:02:37:32 +0000] "GET /v1/tasks/:id/claim HTTP/1.1" 429 214 "-" "-"
zero-nginx | 172.18.0.1 - - [12/Oct/2017:02:37:32 +0000] "GET /v1/tasks/:id/claim HTTP/1.1" 429 214 "-" "-"
[...etc]
Testing with siege:
$ siege -b -r 1 -c 10 http://api.getzero.ai.0.0.0.0.nip.io/v1/tasks/:id/claim
** SIEGE 4.0.4
** Preparing 10 concurrent users for battle.
The server is now under siege...
HTTP/1.1 202 0.00 secs: 12 bytes ==> GET /v1/tasks/:id/claim
HTTP/1.1 429 0.00 secs: 186 bytes ==> GET /v1/tasks/:id/claim
HTTP/1.1 429 0.01 secs: 186 bytes ==> GET /v1/tasks/:id/claim
HTTP/1.1 429 0.01 secs: 186 bytes ==> GET /v1/tasks/:id/claim
HTTP/1.1 429 0.01 secs: 186 bytes ==> GET /v1/tasks/:id/claim
HTTP/1.1 429 0.01 secs: 186 bytes ==> GET /v1/tasks/:id/claim
HTTP/1.1 429 0.01 secs: 186 bytes ==> GET /v1/tasks/:id/claim
HTTP/1.1 429 0.01 secs: 186 bytes ==> GET /v1/tasks/:id/claim
HTTP/1.1 429 0.01 secs: 186 bytes ==> GET /v1/tasks/:id/claim
HTTP/1.1 429 0.01 secs: 186 bytes ==> GET /v1/tasks/:id/claim
HTTP/1.1 429 0.01 secs: 186 bytes ==> GET /v1/tasks/:id/claim
Transactions: 11 hits
Availability: 100.00 %
Elapsed time: 0.01 secs
Data transferred: 0.00 MB
Response time: 0.01 secs
Transaction rate: 1100.00 trans/sec
Throughput: 0.18 MB/sec
Concurrency: 10.00
Successful transactions: 1
Failed transactions: 0
Longest transaction: 0.01
Shortest transaction: 0.01