Sobes.tech
Назад к вопросам
Senior
5

Как сделать ограничение на количество вызовов polling worker'а, если API платная?

Компании, где спрашивали
OZONOZON

Ответ от нейросети

sobes.tech AI

Чтобы ограничить количество вызовов polling worker'а при работе с платным API, можно использовать несколько подходов:

  1. Токен-бакет (Token Bucket) или Лимитатор (Rate Limiter)

    • Хранить счётчик вызовов и время последнего сброса.
    • Перед каждым вызовом проверять, не превышен ли лимит.
  2. Планирование вызовов с задержками

    • Использовать таймеры или sleep, чтобы между вызовами выдерживать необходимый интервал.
  3. Хранение состояния в памяти или внешнем хранилище

    • Если 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.