Как реализовать rate limiting через каналы?

Middle
235 просмотров
AFK Offer AI

Создаёшь ticker: tick := time.NewTicker(time.Second / ratePerSec). В горутине перед каждой операцией ждёшь <-tick.C — это ограничивает скорость. Для burst: buffered channel размером burst, заполняешь тикером, потребитель читает. Пока буфер полон — операции мгновенные, когда кончился — ждёт тикера. Это по сути token bucket на каналах. Просто и идиоматично для Go. Для production лучше golang.org/x/time/rate — там больше контроля.

Следующий вопрос

Как реализовать concurrent-safe counter?