Назад к вопросам
Холодильник.ру
Senior
4
Спроектируй rate limiter для внешнего API с лимитом 100 запросов в секунду/минуту
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Для реализации rate limiter с лимитом 100 запросов в секунду или минуту во внешнем API на Go можно использовать алгоритм Token Bucket или Leaky Bucket. Один из простых способов — использовать библиотеку golang.org/x/time/rate.
Пример с лимитом 100 запросов в секунду:
package main
import (
"context"
"fmt"
"golang.org/x/time/rate"
"time"
)
func main() {
limiter := rate.NewLimiter(100, 100) // 100 запросов в секунду, с "бакетом" на 100 токенов
for i := 0; i < 105; i++ {
if err := limiter.Wait(context.Background()); err != nil {
fmt.Println("Ошибка ожидания:", err)
return
}
fmt.Printf("Запрос %d отправлен в %v\n", i+1, time.Now())
}
}
Для лимита в минуту можно создать лимитер с частотой 100/60 запросов в секунду:
limiter := rate.NewLimiter(rate.Every(time.Minute/100), 100)
Основные моменты:
rate.NewLimiterпринимает скорость и размер бакета.- Метод
Waitблокирует выполнение, пока не появится возможность отправить запрос. - Можно использовать неблокирующий метод
Allowдля проверки возможности без ожидания.
Такой подход позволяет гибко контролировать скорость запросов к внешнему API.