登录
首页 >  Golang >  Go问答

达到最大客户端限制时,处理程序应返回错误

来源:stackoverflow

时间:2024-03-02 17:15:26 356浏览 收藏

编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《达到最大客户端限制时,处理程序应返回错误》,文章讲解的知识点主要包括,如果你对Golang方面的知识点感兴趣,就不要错过golang学习网,在这可以对大家的知识积累有所帮助,助力开发能力的提升。

问题内容

我编写了一个小包装函数,它使用计数信号量概念来限制与特定处理程序的连接数量(因为该处理程序非常消耗资源)。下面是实现相同功能的代码。

func limitnumclients(f http.handlerfunc, maxclients int) http.handlerfunc {
    // counting semaphore using a buffered channel
    sema := make(chan struct{}, maxclients)

    return func(w http.responsewriter, req *http.request) {
        sema <- struct{}{}
        defer func() { <-sema }()
        f(w, req)
    }
}

然后将其包装在处理程序中,如下所示

Route{
        "Test",
        "GET",
        /test,
        LimitNumClients(testhandler, 5),
    },

现在,当任何新连接达到客户端限制时,我想回复 501 错误。 如何实现相同的目标。


解决方案


您可以使用非阻塞发送操作。如果成功,则照常继续,如果在 sema 上发送会阻塞,则发回错误并从限制器返回,而不调用处理程序:

return func(w http.responsewriter, req *http.request) {
    select {
    case sema <- struct{}{}:
    default:
        http.error(w, "rate limit reached", 501)
        return
    }

    defer func() { <-sema }()
    f(w, req)
}

另请注意,要发出“已达到速率限制”错误信号,返回的状态代码应为 http 429 too many requests,请参阅 RFC 6585

所以返回这个:

http.Error(w, "rate limit reached", http.StatusTooManyRequests)

今天关于《达到最大客户端限制时,处理程序应返回错误》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

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