golang 请求处理频率控制

/*
   go请求处理
   频率控制

   频率控制是控制资源利用和保证服务高质量的重要机制
   go可以使用goroutine channel ticker来以优雅的方式支持频率控制
*/

package main

import (
    "fmt"
    "time"
)

func main() {
    /*
       首先我们看下基本的频率限制
       假设我们得控制请求频率
       我们使用一个通道来处理所有的这些请求
       这里向requests发送5个数据 然后关闭requests通道
    */

    requests := make(chan int, 5)
    for i := 1; i <= 5; i++ {
        requests <- i
    }

    close(requests)

    /*
      这个limiter的Ticker每隔200毫秒结束通道阻塞
      这个limiter就是我们的控制器
    */

    limiter := time.Tick(time.Millisecond * 200)

    /*
       通过阻塞从limiter通道接收数据 我们将请求处理控制在每隔200毫秒
       处理一个请求
       注意<-limiter的阻塞作用
    */

    for req := range requests {
        <-limiter
        fmt.Println("request", req, time.Now())
    }

    /*
       我们可以保持正常的请求频率限制 但也允许请求短时间内爆发
       我们可以通过通道缓存来实现
       比如下面这个burstyLimiter 就允许同时处理3个事件
    */

    burstyLimiter := make(chan time.Time, 3)
    for i := 0; i < 3; i++ {
        burstyLimiter <- time.Now()
    }

    /*
       然后每隔200毫秒再向burstyLimiter发送一个数据
       这里不断地每隔200毫秒向burstyLimiter发送数据
    */

    go func() {
        for t := range time.Tick(time.Millisecond * 200) {
            burstyLimiter <- t
        }
    }()

    /*
      这里模拟5个请求 burstyRequest的前面3个请求会连续被处理

    */

    burstyRequests := make(chan int, 5)
    for i:= 1; i < =5; i++ {
       burstyRequests <- i 
    }

    close(burstyRequests)
    for req := range burstyRequests{
        <-burstyLimiter
        fmt.Println("request", req, time.Now())
    }
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值