Heim >Backend-Entwicklung >Golang >Wie gehe ich ordnungsgemäß mit toten RabbitMQ-Verbindungen in Go um?

Wie gehe ich ordnungsgemäß mit toten RabbitMQ-Verbindungen in Go um?

Linda Hamilton
Linda HamiltonOriginal
2024-12-10 06:48:12388Durchsuche

How to Gracefully Handle Dead RabbitMQ Connections in Go?

Erkennen toter RabbitMQ-Verbindungen in Go

In diesem Szenario kann ein in Go unter Verwendung der Streadway/Amqp-Bibliothek geschriebenes Verbraucherskript nicht beendet werden, wenn Der RabbitMQ-Server wird gestoppt. Darüber hinaus empfängt der Verbraucher keine Nachrichten mehr, sobald der Server neu gestartet wird.

Lösung: Verbindungsbenachrichtigung verwenden

Der Typ amqp.Connection verfügt über eine NotifyClose()-Methode, die eine bereitstellt Kanal zur Signalisierung von Transport- oder Protokollfehlern. Mithilfe dieser Methode können wir Verbindungsabbruchereignisse verarbeiten und ordnungsgemäß behandeln.

Der folgende Codeausschnitt zeigt, wie die Verbindungsbenachrichtigung verwendet wird, um unterbrochene Verbindungen zu erkennen und erforderliche Aktionen auszuführen:

import (
    "log"
    "time"

    "github.com/streadway/amqp"
)

func main() {
    for {  // Reconnection loop
        conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/") // Setup
        if err != nil {
            log.Fatal(err)
        }
        notify := conn.NotifyClose(make(chan *amqp.Error)) // Error channel

        ch, err := conn.Channel()
        if err != nil {
            log.Fatal(err)
        }
        msgs, err := ch.Consume(
            "test_task_queue", // Queue
            "",     // Consumer
            false,  // Auto-ack
            false,  // Exclusive
            false,  // No-local
            false,  // No-wait
            nil,    // Args
        )
        if err != nil {
            log.Fatal(err)
        }

        for {  // Receive loop
            select {  // Check connection
            case err = <-notify:
                // Work with error
                log.Println(err)
                break // Reconnect
            case d := <-msgs:
                // Work with message
                log.Printf("Received a message: %s", d.Body)
                d.Ack(false)
                dotCount := bytes.Count(d.Body, []byte("."))
                t := time.Duration(dotCount)
                time.Sleep(t * time.Second)
                log.Printf("Done")
            }
        }
    }
}

In diesem modifizierten Skript haben wir die Hauptkonsumentenlogik in eine Schleife eingebunden, die mithilfe des Benachrichtigungskanals kontinuierlich prüft, ob die Verbindung geschlossen wird. Wenn ein Fehler empfangen wird, wird der Fehler protokolliert und der Prozess stellt die Verbindung wieder her.

Durch die Verwendung von Verbindungsbenachrichtigungen können wir unterbrochene RabbitMQ-Verbindungen erkennen und entsprechende Maßnahmen ergreifen, wie z. B. die Wiederherstellung der Verbindung, die Protokollierung von Fehlern oder die Beendigung des Skripts.

Das obige ist der detaillierte Inhalt vonWie gehe ich ordnungsgemäß mit toten RabbitMQ-Verbindungen in Go um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn