Giao diện
Case study: rate limiter
Giới hạn số request mỗi người dùng, IP hoặc API key được gửi trong một khoảng thời gian.
Dàn ý
- Yêu cầu: giới hạn theo ai (user, IP, API key, gói cước), theo API nào; trả
429 Too Many RequestskèmRetry-Aftervà các headerRateLimit-*. - Thuật toán: fixed window, sliding window log, sliding window counter, token bucket, leaky bucket; độ chính xác, bộ nhớ, khả năng cho phép bùng nổ ngắn (burst).
- Đặt ở đâu: API gateway / Nginx (
limit_req), middleware trong app, hay service riêng. - Nhiều instance: đếm chung trên Redis (
INCR+EXPIRE, sorted set cho sliding window), Lua script để kiểm tra và tăng nguyên tử (Redis). - Redis lỗi thì sao: fail open (cho qua) hay fail closed (chặn); kết hợp giới hạn cục bộ trong từng instance.
- Nhiều tầng: theo IP để chống lạm dụng, theo user theo gói cước, giới hạn toàn hệ thống để bảo vệ database.
- Node.js: express-rate-limit, rate-limiter-flexible.