Skip to content

Instantly share code, notes, and snippets.

@jomido
Last active October 13, 2017 16:41
Show Gist options
  • Save jomido/b1206ee532ac15455d0e7cc1dc22d7f9 to your computer and use it in GitHub Desktop.
Save jomido/b1206ee532ac15455d0e7cc1dc22d7f9 to your computer and use it in GitHub Desktop.
Dedupe and limit HTTP request with NGINX

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment