Rate limiting — ограничение количества запросов от клиента за период времени. Защищает от DDoS, брутфорса и злоупотреблений API.
В Go стандартный подход — token bucket через golang.org/x/time/rate:
limiter := rate.NewLimiter(rate.Every(time.Second), 10) // 10 req/sec
func rateLimitMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if !limiter.Allow() {
http.Error(w, "too many requests", 429)
return
}
next.ServeHTTP(w, r)
})
}
Для per-user лимитов хранят limiter в map по IP или user_id. В распределённых системах используют Redis (INCR с TTL или скрипт sliding window). Возвращай заголовки X-RateLimit-Remaining, чтобы клиент знал свой лимит.