Sobes.tech
Назад к вопросам
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.