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

时间:2019-05-02 08:43:02

标签: go mux

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

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错误回复。 如何实现相同的目标。

1 个答案:

答案 0 :(得分:6)

您可以使用非阻塞发送操作。如果成功,则继续执行常规操作,如果在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

还请注意,要发出“达到速率限制”错误的信号,返回的状态码应为http.Error(w, "rate limit reached", http.StatusTooManyRequests) ,请参见RFC 6585

因此返回此:

in:comments