Heim > Backend-Entwicklung > Golang > Wie erkennt und verarbeitet man tote RabbitMQ-Verbindungen in Go?

Wie erkennt und verarbeitet man tote RabbitMQ-Verbindungen in Go?

DDD
Freigeben: 2024-12-03 05:34:09
Original
382 Leute haben es durchsucht

How to Detect and Handle Dead RabbitMQ Connections in Go?

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")
            }
        }
    }
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage