Global limit vs per-key limit

A global limit counts all requests together, so a botnet and real people share one budget. A per-key limit gives each account its own budget. With 3,000 guesses/s at 10 accounts, a global limit of 1,000 requests/s lets 525 guesses/s through. The target is 20. A limit of 1 try/s per account passes.

Play the level

A token bucket on guessesDrag or use arrow keys to change the limit

Limit 1/s per account · all codes tried in 12 days

A buffer with a valveDrag or use arrow keys to change the buffer size

Buffer 1,000 jobs · last job waits 1.0 s · 17% turned away

Case 1

People send 200 codes/s across 100,000 accounts. A botnet sends 3,000 guesses/s at 10 accounts. At most 20 guesses/s may pass, and under 0.5 percent of real codes may fail.

Case 1
Measure Goal Global limit, 1,000 requests/s Limit of 1 try/s per account
Throughput (Guesses) under 20 req/s 525 req/s Fail 4 req/s Pass
Error rate (Codes) under 0.5% 0% Pass 0% Pass
p99 latency (Codes) under 150 ms 115 ms Pass 73 ms Pass
Monthly cost 16 USD/mo 16 USD/mo
HTTP/2HTTP/2SQLUsersUsersLoad balanc…0.5 vCPU · 0.5 GBAPI server0.5 vCPU · 1 GBPostgres1 vCPU · 2 GBRate limiter0.5 vCPU · 0.5 GB
HTTP/2HTTP/2SQLUsersUsersLoad balanc…API serverPostgresRate limiter
Global limit, 1,000 requests/s: misses a goal
HTTP/2HTTP/2SQLUsersUsersLoad balanc…0.5 vCPU · 0.5 GBAPI server0.5 vCPU · 1 GBPostgres1 vCPU · 2 GBRate limiter0.5 vCPU · 0.5 GB
HTTP/2HTTP/2SQLUsersUsersLoad balanc…API serverPostgresRate limiter
Limit of 1 try/s per account: meets the goals