Để implement rate limiting trong Go, cách chuẩn là dùng package golang.org/x/time/rate với token bucket algorithm: limiter := rate.NewLimiter(rate.Every(time.Second), 10) tạo limiter cho phép 10 request mỗi giây.
- Trong HTTP middleware, kiểm tra
if !limiter.Allow()và trả về status 429 Too Many Requests nếu vượt giới hạn. - Để giới hạn theo từng client (per-IP), cần dùng
map[string]*rate.Limiterkết hợp với mutex để quản lý limiter riêng cho mỗi IP, đồng thời nên dọn dẹp các limiter cũ theo định kỳ để tránh memory leak. - Trong môi trường production nhiều server, nên dùng Redis-based distributed rate limiter để đảm bảo giới hạn nhất quán across tất cả instances.
The standard approach uses golang.org/x/time/rate with a token bucket: limiter := rate.NewLimiter(rate.Every(time.Second), 10) allows 10 requests per second.
- In HTTP middleware, check
if !limiter.Allow()and return 429 Too Many Requests if exceeded. - For per-client limiting, maintain a
map[string]*rate.Limiterprotected by a mutex, and periodically clean up stale limiters to avoid memory leaks. - In a multi-server production environment, use a Redis-based distributed rate limiter to enforce consistent limits across all instances.