Skip to content

fuyao-w/rate_limit

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

限流工具【令牌桶实现】

用法:

  • 初始化:
func NewBucket(capacity, quantum int64, fillInterval time.Duration, options ...OptionF) (bucket *Bucket) 

NewBucket 返回一个新的令牌桶,每 fillInterval 个时间间隔,填充 quantum 个令牌的,直到给定的最大容量。桶初始化后就是满的

options 可选 WithClock(mockClock) 可以用其他时钟代替,方便 mock 测试 ,WithProhibitOverflow() 禁止桶溢出,此时退换成漏桶算法

  • 获取一定数量的令牌
func (b *Bucket) Take(count int64) 

Take 获取一定数量的令牌,如果当前桶中令牌数量不够,则阻塞直到获取成功

如果不使用 prohibitOverflow 选项, err 永远返回 nil ,如果使用 prohibitOverflow 选项,则获取超过容量的令牌数则会返回 ErrProhibitOverflow

  • 在规定的等待时间内获取一定数量令牌
func (b *Bucket) TryTake(count int64, maxWait time.Duration) (succ bool)

从桶中获取一定数量的令牌,如果桶中令牌数充足则立即返回 true,或者桶中令牌数不够但是预计等待时间 <= maxWait 则阻塞到实际等待时间后并返回 true ,否则返回 false

如果使用 prohibitOverflow 选项并且count超过了capacity 则永远返回false

  • 尝试获取一定数量的令牌,不阻塞
func (b *Bucket) TakeAvailable(count int64) (realCount int64) 

尝试获取 count 个令牌,如果桶中令牌不够也不会阻塞,返回值告诉调用方实际上获取了多少个令牌

realCount 不会大于容量

  • 当前可用的令牌数量
func (b *Bucket) Available() (available int64)

返回当前可用的令牌数量

About

限流工具【令牌桶算法】

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages