Gin: Wie kann ich die Anzahl der aktuellen Anfragen begrenzen?

Erstellt am 21. Juni 2017  ·  3Kommentare  ·  Quelle: gin-gonic/gin

Zum Beispiel erlaube ich bis zu 2000 aktuelle Verbindungen und lehne überschüssige Anfragen ab.

question

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)


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


Alle 3 Kommentare

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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen