Overview
The Go SDK provides a built‑in rate limiter to protect your application from exceeding API quotas. It supports token‑bucket and leaky‑bucket algorithms, configurable burst capacity, and automatic back‑off.
Rate limiting is applied per client instance. Create separate clients for different rate‑limit policies.
Basic Usage
Instantiate a RateLimiter
and wrap your API calls.
package main
import (
"context"
"log"
"time"
"example.com/sdk"
"example.com/sdk/ratelimit"
)
func main() {
// Create a client with a rate limiter: 100 requests per minute
limiter := ratelimit.NewTokenBucket(100, time.Minute)
client := sdk.NewClient(sdk.Options{
RateLimiter: limiter,
})
ctx := context.Background()
for i := 0; i < 5; i++ {
resp, err := client.GetResource(ctx, "resource-id")
if err != nil {
log.Fatalf("API error: %v", err)
}
log.Printf("Result %d: %s", i+1, resp.Data)
}
}
Advanced Configuration
You can customize the bucket size, refill interval, and enable jitter to spread out bursts.
limiter := ratelimit.NewLeakyBucket(
ratelimit.Config{
Capacity: 200, // max tokens
RefillRate: 200, // tokens per minute
RefillPeriod: time.Minute,
Jitter: true, // randomize refill timing
},
)
client := sdk.NewClient(sdk.Options{RateLimiter: limiter})
Reference
type RateLimiter
Interface implemented by all limiters.
type RateLimiter interface {
// Wait blocks until a token is available or context is cancelled.
Wait(ctx context.Context) error
// Reserve returns a reservation without blocking.
Reserve() (Reservation, error)
}
type TokenBucket
Standard token‑bucket implementation.
func NewTokenBucket(rate int, period time.Duration) *TokenBucket
type LeakyBucket
Leaky‑bucket with optional jitter.
type Config struct {
Capacity int
RefillRate int
RefillPeriod time.Duration
Jitter bool
}
func NewLeakyBucket(cfg Config) *LeakyBucket