我编写了一个小的包装函数,该函数使用计数信号量概念来限制到特定处理程序的连接数(因为此处理程序很耗资源)。下面是实现相同目的的代码。
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错误回复。 如何实现相同的目标。
答案 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