
最近做网关项目,QPS 一上来就被打挂,索性自己撸了个限流中间件。核心用的是令牌桶算法,单机每秒放 N 个令牌,桶满就拒绝。
关键代码片段(简化版):
func (l *Limiter) Allow() bool {
now := time.Now().UnixNano()
tokens := l.tokens + float64(now-l.last)/int64(l.rate)
if tokens > l.cap { tokens = l.cap }
if tokens >= 1 {
l.tokens, l.last = tokens-1, now
return true
}
return false
}
目前压测单机 8w QPS 没问题。完整思路和 benchmark 我整理在仓库里了,欢迎来拍砖~
收藏了,跳转统计那块打算用 ClickHouse 还是直接落 MySQL?想参考下思路。
令牌桶方案在高并发下确实稳,请问热点 key 的限流计数是怎么防 Redis 抖动的?
测试username作者-naicha_bjt
测试username作者-awei_laoma
测试username作者-dajian66
沙发!跟着抄作业。
沙发!这篇教程太及时了,正好在搭短链系统,跟着抄作业。