Как ограничить количество использований ручки API

«Как ограничить количество использований ручки API» — вопрос из категории Архитектура, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для ограничения количества вызовов API можно использовать rate limiting. В Go это легко реализовать с помощью пакета golang.org/x/time/rate или middleware в веб-фреймворках (например, Gin, Echo).

Пример с golang.org/x/time/rate:

import (
    "net/http"
    "golang.org/x/time/rate"
)

var limiter = rate.NewLimiter(1, 5) // 1 запрос в секунду, максимум 5 в "пачке"

func limitMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        if !limiter.Allow() {
            http.Error(w, "Too Many Requests", http.StatusTooManyRequests)
            return
        }
        next.ServeHTTP(w, r)
    })
}

Для более сложных сценариев (например, ограничение по IP или ключу API) можно использовать хранилище (Redis) для подсчета запросов.