Return 处理程序达到最大客户端限制时出错

Return error when a handler reaches it max client limit

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

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:

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)
}

另请注意,要发出“达到速率限制”错误信号,returned 状态代码应为 HTTP 429 Too Many Requests,请参阅 RFC 6585

所以 return 这个:

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