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.