ling-baseling-base

Limiter 限流

限流与并发控制,令牌桶与分布式后端

在线 Playground

在浏览器中直接体验本页相关 API,无需本地安装 Go 环境。

另见专题文档:限流完整文档。以下为 common/limiter 包 README 全文。

limiter

A unified rate-limiting and concurrency-control interface with multiple pluggable backends. Follows the "one interface, many backends" pattern.

Interfaces

// Core concurrency control
type Limiter interface {
    Running() int
    Acquire(ctx context.Context, key []byte) error
    Release(key []byte)
}

// String-keyed convenience variant
type StringLimiter interface {
    Running() int
    Acquire(ctx context.Context, key string) error
    Release(key string)
}

// Byte-size-aware (bandwidth / storage quotas)
type SizeLimiter interface {
    Running() int64
    Acquire(ctx context.Context, key []byte, size int64) error
    Release(key []byte, size int64)
    Remaining(key []byte) int64
}

Implementations

PackageTypeDescription
count/ConcurrencyGlobal concurrency cap (atomic or blocking)
keycount/ConcurrencyPer-key concurrency cap (mutex, sync-atomic, or blocking)
keysize/SizePer-key cumulative byte-size cap
tokenbucket/RateToken-bucket rate limiter (QPS / burst)
null/No-op implementation (disable limiting)
redis/DistributedRedis-backed sliding window, token bucket, concurrency
memcached/DistributedMemcached-backed sliding window, concurrency
mongodb/DistributedMongoDB-backed rate limit, concurrency
etcd/Distributedetcd-backed rate limit, concurrency

Usage

import (
    "github.com/LingByte/ling-base/common/limiter"
    "github.com/LingByte/ling-base/common/limiter/count"
    "github.com/LingByte/ling-base/common/limiter/keycount"
    "github.com/LingByte/ling-base/common/limiter/tokenbucket"
)

// Global max 100 concurrent
l := count.New(100)
if err := l.Acquire(nil); err != nil {
    // limit exceeded
}
defer l.Release(nil)

// Per-user max 5 concurrent
l := keycount.New(5)
l.Acquire(nil, []byte("user123"))
defer l.Release([]byte("user123"))

// 100 QPS, burst 200
l := tokenbucket.New(100, 200)
if err := l.Acquire(nil); err != nil {
    // rate limited
}

// String-keyed helper
if err := limiter.AcquireString(l, ctx, "user123"); err != nil {
    // limit exceeded
}
defer limiter.ReleaseString(l, "user123")

Errors

ErrorMeaning
ErrLimitExceededAcquire cannot grant a permit (non-blocking mode)
ErrKeyRequiredImplementation requires a non-empty key
ErrInvalidLimitConfigured limit is ≤ 0
ErrInvalidSizeRequested size is ≤ 0

Testing

All implementations have unit tests. Distributed backends use in-memory mocks or miniredis — no external servers required.

License

MIT

On this page