Mengesan Sambungan RabbitMQ Mati dalam Go
Dalam senario ini, skrip pengguna yang ditulis dalam Go menggunakan perpustakaan streadway/amqp gagal keluar apabila pelayan RabbitMQ dihentikan. Selain itu, pengguna berhenti menerima mesej sebaik sahaja pelayan dimulakan semula.
Penyelesaian: Menggunakan Pemberitahuan Sambungan
Jenis Amqp.Connection mempunyai kaedah NotifyClose() yang menyediakan saluran untuk isyarat pengangkutan atau kesilapan protokol. Dengan menggunakan kaedah ini, kami boleh mengendalikan peristiwa putus sambungan dan mengendalikannya dengan anggun.
Coretan kod berikut menunjukkan cara menggunakan pemberitahuan sambungan untuk mengesan sambungan mati dan melakukan tindakan yang diperlukan:
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") } } } }
Dalam skrip yang diubah suai ini, kami telah membungkus logik pengguna utama dalam gelung yang sentiasa menyemak penutupan sambungan menggunakan saluran pemberitahuan. Jika ralat diterima, ia mencatat ralat dan proses menyambung semula.
Dengan menggunakan pemberitahuan sambungan, kami boleh mengesan sambungan RabbitMQ yang mati dan mengambil tindakan yang sesuai, seperti menyambung semula, mengelog ralat atau menamatkan skrip.
Atas ialah kandungan terperinci Bagaimana Mengendalikan Sambungan Dead RabbitMQ dengan Anggun dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!