Erkennen und Behandeln toter RabbitMQ-Verbindungen in Go
Im bereitgestellten RabbitMQ-Consumer-Skript führt eine Unterbrechung im Betrieb des RabbitMQ-Servers dazu, dass das Skript ausgeführt wird reagiert aber nicht auf Nachrichten. Um dieses Problem zu beheben, ist es wichtig, unterbrochene Verbindungen zu erkennen und die Verbindung entweder wiederherzustellen oder das Skript zu beenden.
Die zugrunde liegende Bibliothek streadway/amqp bietet eine Lösung. Der Typ amqp.Connection verfügt über eine NotifyClose()-Methode, die einen Kanal zurückgibt, der Transport- oder Protokollfehler signalisiert. Durch die Verwendung dieses Kanals ist es möglich, Verbindungsfehler zu erkennen.
Hier ist eine aktualisierte Version des Skripts, die die Behandlung von Verbindungsfehlern enthält:
import ( "log" "github.com/streadway/amqp" ) func main() { // Connection loop for { conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/") if err != nil { log.Printf("Failed to connect to RabbitMQ: %v", err) continue } notify := conn.NotifyClose(make(chan *amqp.Error)) ch, err := conn.Channel() if err != nil { log.Printf("Failed to open a channel: %v", err) continue } q, err := ch.QueueDeclare( "test_task_queue", true, false, false, false, nil, ) if err != nil { log.Printf("Failed to declare a queue: %v", err) continue } err = ch.Qos( 1, 0, false, ) if err != nil { log.Printf("Failed to set QoS: %v", err) continue } msgs, err := ch.Consume( q.Name, "", false, false, false, false, nil, ) if err != nil { log.Printf("Failed to register a consumer: %v", err) continue } // Message receive loop for { select { case err := <-notify: // Connection error handling log.Printf("Connection error: %v", err) break // Reconnect case d := <-msgs: // Message handling log.Printf("Received a message: %s", d.Body) d.Ack(false) dot_count := bytes.Count(d.Body, []byte(".")) t := time.Duration(dot_count) time.Sleep(t * time.Second) log.Printf("Done") } } } }
In diesem überarbeiteten Skript umschließt die Verbindungsschleife die andere Operationen. Innerhalb der Nachrichtenempfangsschleife überprüft eine Select-Anweisung sowohl den Fehlerkanal als auch die eingehenden Nachrichten. Wenn ein Verbindungsfehler erkannt wird, wird der Fehler protokolliert und eine erneute Verbindung ausgelöst. Dieser Mechanismus stellt sicher, dass das Skript vorübergehende Verbindungsprobleme beheben und den normalen Betrieb wieder aufnehmen kann.
Das obige ist der detaillierte Inhalt vonWie erkennt und verarbeitet man tote RabbitMQ-Verbindungen in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!