Rate limit

Rate limit cho vị trí Senior Backend / Tech Lead: thuật toán, chạy trên nhiều server, cách tính ra con số, chọn phạm vi (từng route, từng user, từng tenant hay cả hệ thống) và vận hành. Ví dụ xuyên suốt: shop Laravel (project laravel-livewire) có thêm API cho đối tác. Nên đọc theo thứ tự 1 → 6. Mọi output là output thật: Laravel 12.64 / 13.34, Redis 8.8, nginx 1.31, php-fpm 8.3, Node 22, PostgreSQL 18.4.

Bài 1 · Nền tảng

Rate limit là gì thật sự — bài toán gốc, đặt ở tầng nào, hợp đồng 429

Rate limit, quota, concurrency limit, load shedding khác nhau ở đâu; 4 tầng đặt limiter; 429 + Retry-After; nginx mặc định trả 503; Laravel trả header gì.

Bài 2 · Thuật toán

6 thuật toán — fixed window, sliding log, sliding window counter, token bucket, leaky bucket, GCRA

Cùng luồng request qua 6 thuật toán: fixed window lọt 199/100 ở ranh giới; sliding log 95 KB/key; GCRA ra số y hệt token bucket với 1 con số; xô hàng đợi bắt chờ 60 giây.

Bài 3 · Phân tán

Rate limit dùng chung nhiều server — Redis, race, Lua, lệch đồng hồ, failover

GET rồi INCR cho qua 200/10; throttle của Laravel cho qua tới 50/10 khi 50 worker cùng tới; Redis treo làm mỗi request kẹt 60 giây; failover mất 60 lần đếm; CROSSSLOT.

Bài 4 · Con số

Tính con số limit — đo capacity, Little's law, headroom, burst, limit theo chi phí

php-fpm 4 worker: trần lý thuyết 80, thật ~76; tải 1,5× là goodput rơi còn ~18/s và làm phí ~2 000 request; DB chậm thì rate limit cố định sập, concurrency limit thì không; ngưỡng từ percentile.

Bài 5 · Phạm vi

Từng route, từng user, từng tenant hay cả hệ thống — thiết kế nhiều tầng, chọn key

Quên ->by() là limit chung; throttle:60,1 và 5,1 dùng chung bộ đếm; thứ tự limit làm khách bị chặn oan; trustProxies('*') của Laravel 13 đổi nghĩa; nginx limit_req và 6 cái bẫy.

Bài 6 · Vận hành

Vận hành rate limit — header, retry + jitter, giám sát, shadow mode, ADR

1 000 client chờ đúng Retry-After tạo đỉnh 441 request/100ms; jitter giảm còn 303; Http::retry của Laravel bỏ qua Retry-After và gửi lại cả POST lỗi 422.