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") } } } }
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!