Sobes.tech
Senior

// teenus kasutab välise API marsruutide koostamiseks, // tarifis on RPS piirang. // Tuleb kavandada rate limiter. // 100 rps type RouteClient struct { limiter } func (rc *RouteClient) Get(req string) string { // teha return rc.get(req) }

sobes.tech AI

Vastus AI-lt

Selleks, et rakendada kiiruse piiraja, mille piirang on 100 RPS (päringut sekundis), saab kasutada token-bucket või loendurit koos ajastiga. Go-s on mugav kasutada kanalit või golang.org/x/time/rate raamatukogu.

Näide kasutades rate.Limiter standardraamatukogust:

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

type RouteClient struct {
    limiter *rate.Limiter
}

func NewRouteClient() *RouteClient {
    // 100 päringut sekundis
    limiter := rate.NewLimiter(100, 100) // burst võrdne 100-ga
    return &RouteClient{limiter: limiter}
}

func (rc *RouteClient) Get(req string) string {
    // Oodake loa päringuks
    err := rc.limiter.Wait(context.Background())
    if err != nil {
        // vea töötlemine, nt timeout
        return "error: rate limit"
    }
    return rc.get(req)
}

func (rc *RouteClient) get(req string) string {
    // Väline API kutsumine
    return "response"
}

See piiraja tagab, et ei ületata 100 päringut sekundis, ning võimaldab lühiajalisi (burst) kuni 100 päringut.