Yêu cầu: giới hạn số request theo client (user/IP/API key) trong một cửa sổ, chính xác trên toàn cụm nhiều node, thêm độ trễ tối thiểu.
Hướng thiết kế:
- Thuật toán: token bucket (cho burst có kiểm soát, phổ biến) hoặc sliding window log/counter (chính xác hơn ở ranh giới). Fixed window đơn giản nhưng có burst ở mép cửa sổ.
- State tập trung: đếm cục bộ từng node sẽ sai tổng → lưu counter ở store chia sẻ, nhanh (Redis), key theo client + cửa sổ. Dùng thao tác atomic (INCR + EXPIRE, hoặc Lua script) để tránh race.
- Vị trí: đặt ở API gateway/edge để chặn sớm; per-service cho giới hạn riêng.
- Phản hồi: vượt hạn trả 429 kèm Retry-After và header X-RateLimit-*.
- Đánh đổi độ chính xác/độ trễ: gọi Redis mỗi request là chính xác nhưng thêm hop → có thể dùng token cục bộ + đồng bộ định kỳ để giảm latency, chấp nhận sai số nhỏ.
Lưu ý: xử lý Redis chết (fail-open hay fail-closed?), và đồng hồ lệch giữa các node.