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!