Sobes.tech
Junior — Middle

Как се реализира механизмът за ограничаване на броя на заявките за единица време в системата?

sobes.tech AI

Отговор от AI

Механизмът за ограничаване на броя на заявките за единица време (rate limiting) в Go често се реализира с помощта на токени или броячи с времеви прозорец.

Пример с използване на пакета golang.org/x/time/rate:

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

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

func handler(w http.ResponseWriter, r *http.Request) {
    if !limiter.Allow() {
        http.Error(w, "Too Many Requests", http.StatusTooManyRequests)
        return
    }
    // обработка на заявката
}

Тук rate.NewLimiter създава лимитатор, който позволява 1 заявка на секунда, но може да натрупа до 5 токена, което позволява кратки изблици на заявки. Ако има твърде много заявки, те се отхвърлят с грешка 429.

Други подходи включват фиксирано окно, плъзгащо се окно или използване на Redis за разпределено ограничаване на скоростта.