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