Zum Beispiel erlaube ich bis zu 2000 aktuelle Verbindungen und lehne überschüssige Anfragen ab.
Sie können eine Middleware schreiben, die versucht, jedes Mal, wenn eine neue Verbindung hergestellt wird, in einen gepufferten Kanal einzufügen.
(Dies ist nur ein Proof of Concept, keine gültige Syntax)
func LimitMiddleware() gin.HandlerFunc {
// create a buffered channel with 2000 spaces
semaphore := make(chan bool, 2000)
return func (c *gin.Context) {
select {
case semaphore <- true: // Try putting a new val into our semaphore
// Ok, managed to get a space in queue. execute the handler
c.Next()
// Don't forget to release a handle
<-semaphore
default:
// Buffer full, so drop the connection. Return whatever status you want here
return
}
}
}
@wangcn Ich habe Gin's Limit Middleware geschrieben , um die Anzahl der aktuellen Anforderungen zu begrenzen, und es kann das Anforderungslimit besser behandeln, wenn Panik auftritt. Sie können es wie folgt verwenden:
package main
import (
"github.com/easonlin404/limit"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.Use(limit.Limit(200)) // limit the number of current requests
r.GET("/", func(c *gin.Context) {
// your code
})
r.Run()
}
Die Verwendung von sync/atomic
möglicherweise vorzuziehen, da Sie niemals blockieren.
Hilfreichster Kommentar
Sie können eine Middleware schreiben, die versucht, jedes Mal, wenn eine neue Verbindung hergestellt wird, in einen gepufferten Kanal einzufügen.
(Dies ist nur ein Proof of Concept, keine gültige Syntax)