Sobes.tech
Senior

Tervezzen egy rate limitert egy külső API-hoz, 100 kérés/másodperc vagy perc limit mellett

sobes.tech MI

Válasz az MI-től

A Go nyelvben külső API-hoz rate limiter implementálásához, amely 100 kérést enged másodpercenként vagy percenként, használhatja a Token Bucket vagy Leaky Bucket algoritmust. Az egyik legegyszerűbb módszer a golang.org/x/time/rate könyvtár használata.

Példa 100 kérés/sec limittel:

package main

import (
    "context"
    "fmt"
    "golang.org/x/time/rate"
    "time"
)

func main() {
    limiter := rate.NewLimiter(100, 100) // 100 kérés másodpercenként, 100 tokenes "kád"

    for i := 0; i < 105; i++ {
        if err := limiter.Wait(context.Background()); err != nil {
            fmt.Println("Várakozási hiba:", err)
            return
        }
        fmt.Printf("Kérelem %d elküldve %v\n", i+1, time.Now())
    }
}

Percenkénti limit esetén létrehozhat egy limitert a 100/60 frekvenciával:

limiter := rate.NewLimiter(rate.Every(time.Minute/100), 100)

Főbb pontok:

  • rate.NewLimiter elfogadja a sebességet és a "kád" méretét.
  • A Wait metódus blokkolja a végrehajtást, amíg lehetőség nem adódik a kérés küldésére.
  • A nem-blokkoló Allow metódus segítségével ellenőrizhető a lehetőség anélkül, hogy várakozni kellene.

Ez a megközelítés rugalmasan szabályozza a külső API felé irányuló kérések sebességét.