Maison > développement back-end > Golang > Comment gérer gracieusement les connexions Dead RabbitMQ dans Go ?

Comment gérer gracieusement les connexions Dead RabbitMQ dans Go ?

Linda Hamilton
Libérer: 2024-12-10 06:48:12
original
387 Les gens l'ont consulté

How to Gracefully Handle Dead RabbitMQ Connections in Go?

Détection des connexions RabbitMQ mortes dans Go

Dans ce scénario, un script consommateur écrit en Go à l'aide de la bibliothèque streadway/amqp ne parvient pas à se fermer lorsque le serveur RabbitMQ est arrêté. De plus, le consommateur cesse de recevoir des messages une fois le serveur redémarré.

Solution : Utilisation de la notification de connexion

Le type amqp.Connection possède une méthode NotifyClose() qui fournit un canal pour signaler les erreurs de transport ou de protocole. En utilisant cette méthode, nous pouvons gérer les événements de perte de connexion et les gérer gracieusement.

L'extrait de code suivant montre comment utiliser la notification de connexion pour détecter les connexions mortes et effectuer les actions nécessaires :

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")
            }
        }
    }
}
Copier après la connexion

Dans ce script modifié, nous avons encapsulé la logique principale du consommateur dans une boucle qui vérifie en permanence la fermeture de la connexion à l'aide du canal de notification. Si une erreur est reçue, il enregistre l'erreur et le processus se reconnecte.

En utilisant les notifications de connexion, nous pouvons détecter les connexions RabbitMQ mortes et prendre les mesures appropriées, telles que la reconnexion, la journalisation des erreurs ou la fin du script.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal