Rate limiting нужен, чтобы один клиент (или злоумышленник) не мог перегрузить сервер. Популярные схемы: token bucket, leaky bucket, скользящее окно.
limiter := rate.NewLimiter(rate.Every(time.Second), 10) // 10 запросов в секунду
if !limiter.Allow() {
http.Error(w, "Too Many Requests", 429)
return
}Для распределенного сервиса счетчики хранят в Redis (INCR + EXPIRE). В Go часто используют golang.org/x/time/rate.