用go实现限流算法
限流算法有很多种,常见的有漏桶算法、令牌桶算法。以下是用Go实现的简单的令牌桶算法示例:
package main
import (
"fmt"
"sync"
"time"
)
type TokenBucketLimiter struct {
capacity int64 // 桶的容量
rate int64 // 填充速率
tokens int64 // 当前令牌数
lastTime time.Time
mu sync.Mutex
}
func NewTokenBucketLimiter(capacity int64, rate int64) *TokenBucketLimiter {
return &TokenBucketLimiter{
capacity: capacity,
rate: rate,
tokens: capacity,
lastTime: time.Now(),
}
}
func (l *TokenBucketLimiter) reserve() bool {
l.mu.Lock()
defer l.mu.Unlock()
now := time.Now()
l.tokens = min(l.capacity, l.tokens+l.rate*(now.Sub(l.lastTime).Seconds()))
l.lastTime = now
if l.tokens < 1 {
return false
}
l.tokens--
return true
}
func min(a, b int64) int64 {
if a < b {
return a
}
return b
}
func main() {
limiter := NewTokenBucketLimiter(10, 1) // 桶容量为10,填充速率为每秒1个令牌
for i := 0; i < 20; i++ {
if limiter.reserve() {
fmt.Println("Request allowed")
} else {
fmt.Println("Request rejected")
}
time.Sleep(500 * time.Millisecond)
}
}
这段代码实现了一个简单的令牌桶限流器,其中NewTokenBucketLimiter
函数创建了一个新的限流器,reserve
方法用于尝试获取令牌以执行操作。如果没有足够的令牌,则返回false
,表示请求被拒绝。实际应用中,需要考虑并发安全和性能优化。
评论已关闭