Назад к вопросам
OZON
Senior
5
Как сделать ограничение на количество вызовов polling worker'а, если API платная?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Чтобы ограничить количество вызовов polling worker'а при работе с платным API, можно использовать несколько подходов:
-
Токен-бакет (Token Bucket) или Лимитатор (Rate Limiter)
- Хранить счётчик вызовов и время последнего сброса.
- Перед каждым вызовом проверять, не превышен ли лимит.
-
Планирование вызовов с задержками
- Использовать таймеры или sleep, чтобы между вызовами выдерживать необходимый интервал.
-
Хранение состояния в памяти или внешнем хранилище
- Если worker распределённый, состояние лимита нужно хранить в Redis или БД.
Пример на Go с простым rate limiter:
package main
import (
"fmt"
"time"
)
func main() {
maxCalls := 5
interval := time.Minute
calls := 0
resetTime := time.Now().Add(interval)
for {
now := time.Now()
if now.After(resetTime) {
calls = 0
resetTime = now.Add(interval)
}
if calls < maxCalls {
// Вызов API
fmt.Println("Calling API")
calls++
} else {
fmt.Println("Rate limit reached, waiting...")
time.Sleep(time.Until(resetTime))
continue
}
// Ждать между вызовами, если нужно
time.Sleep(10 * time.Second)
}
}
Такой подход позволяет контролировать количество запросов и не превышать лимиты платного API.