[关闭]
@LIUHUAN 2019-03-12T15:14:08.000000Z 字数 1526 阅读 1089

限流方法

algorithm


计数法

  1. type CountLimit struct {
  2. timeStamp int64 // 窗口起始时间
  3. count int32 // 窗口内请求量
  4. limitRate int32 // 限速大小
  5. deltaTime int64 // 窗口大小
  6. }
  7. func (c *CountLimit) limitrate() bool {
  8. now := time.Now().Unix()
  9. if now < c.timeStamp+c.deltaTime { // 在时间窗口内
  10. c.count += 1
  11. return c.count < c.limitRate // 是否超过限流大小
  12. } else { // 不在窗口内,直接返回限流
  13. c.timeStamp = now
  14. c.count = 0
  15. return true
  16. }
  17. }

滑动窗口计数法

漏桶算法

  1. type LeakyBucket struct {
  2. limitRate int32 // 限速大小
  3. nextTime int64 // 下一滴水可以流出的最早时间,如果在这个时间点内,那么不能流出,限流
  4. interval int64 // 时间间隔 = 1000 / limitRate
  5. }
  6. func (l *LeakyBucket)limitRate() bool {
  7. now := time.Now().Unix()
  8. timeGap := now - l.nextTime
  9. if now > l.nextTime {
  10. l.nextTime = now + 1000/limitRate // 更新下次通过的时间,可以是当前通过的时间到
  11. return false // 可以通过
  12. }else {
  13. // 限速
  14. return false;
  15. }
  16. }
  17. func main(){
  18. l := LeakyBucket{}
  19. l.limitRate = 100
  20. l.interval = 1000 / l.limitRate
  21. l.nextTime = time.Now().Unix() + l.interval
  22. // if l.limitRate() {} // do something
  23. }

令牌桶算法

  1. type TokenBucket struct {
  2. timeStamp int64 // 桶起作用时间
  3. count int32 // 桶内请求量
  4. limitRate int32 // 限速大小
  5. totalTokens int32 // 令牌桶大小
  6. }
  7. func (t *TokenBucket) limitrate() bool {
  8. now := time.Now().Unix()
  9. passData := int32(now-t.timeStamp) * t.limitRate
  10. t.count = min(t.totalTokens, t.count+passData) // 桶的容量是固定的,放入的令牌要不大于桶的容量
  11. t.timeStamp = now // 更新时间
  12. if t.count < 1 { // 从令牌桶内去令牌,没有令牌了,限速
  13. return true
  14. } else { // 还有令牌
  15. t.count -= 1 // 取令牌
  16. return false
  17. }
  18. }

备注

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注