登录
首页 >  Golang >  Go问答

使用rate.NewLimiter在管道中执行速率限制

来源:stackoverflow

时间:2024-02-29 21:48:26 443浏览 收藏

大家好,今天本人给大家带来文章《使用rate.NewLimiter在管道中执行速率限制》,文中内容主要涉及到,如果你对Golang方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮到你们,谢谢!

问题内容

我正在使用速率限制器来限制路由的请求数量

请求被发送到一个通道,我想限制每秒处理的数量,但我很难理解我是否正确设置了这个,我没有收到错误,但是我不确定我是否使用了速率限制器

这是添加到频道中的内容:

type processitem struct {
    itemstring string
}

这是通道和限制器:

itemchannel := make(chan processitem, 5)
itemthrottler := rate.newlimiter(4, 1) //4 a second, no more per second (1)
var waitgroup sync.waitgroup

项目已添加到频道:

case "newitem":
    waitgroup.add(1)
    itemtoexec := new(processitem)
    itemtoexec.itemstring = "item string"
    itemchannel <- *itemtoexec

然后使用 go 例程来处理添加到通道中的所有内容:

go func() {
    defer waitGroup.Done()
    err := itemThrottler.Wait(context.Background())
    if err != nil {
        fmt.Printf("Error with limiter: %s", err)
        return
    }
    for item := range itemChannel {
        execItem(item.itemString) // the processing function
    }
    defer func() { <-itemChannel }()
}()
waitGroup.Wait()

有人可以确认发生了以下情况吗:

  • execitem 函数每秒在通道的每个成员上运行 4 次

我不明白“err := itemthrottler.wait(context.background())”在代码中做了什么,这是如何调用的?


解决方案


...我不确定我是否使用了速率限制器

是的,您正在使用速率限制器。您正在对代码的 case "newitem": 分支进行速率限制。

我不明白“err := itemthrottler.wait(context.background())”在代码中做了什么

itemthrottler.wait(..) 只会错开请求(4/s,即每 0.25 秒) - 如果超出速率,它不会拒绝请求。那么这是什么意思?如果您在 1 秒内收到过多的 1000 个请求:

  • 4 个请求将立即得到处理;但是
  • 996 个请求将导致 996 个 go 例程积压,从而导致阻塞

996 将以 4/s 的速率解除阻塞,因此待处理的 go 例程的积压将在另外 4 分钟内不会清除(如果有更多请求进来,则可能需要更长的时间)。积压的 go 例程可能是您想要的,也可能不是您想要的。如果没有,您可能需要使用 Limiter.Allow - 如果返回 false,则拒绝该请求(即不创建 go 例程)并返回 429 错误(如果这是 http 请求)。

最后,如果这是一个 http 请求,您应该在调用 wait 时使用它的嵌入上下文,例如

func (a *app) myHandler(w http.ResponseWriter, r *http.Request) {
    // ...

    err := a.ratelimiter(r.Context())

    if err != nil {
        // client http request most likely canceled (i.e. caller disconnected)
    }
}

到这里,我们也就讲完了《使用rate.NewLimiter在管道中执行速率限制》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>