Rumah > pembangunan bahagian belakang > Golang > Bagaimana Mengendalikan Sambungan Dead RabbitMQ dengan Anggun dalam Go?

Bagaimana Mengendalikan Sambungan Dead RabbitMQ dengan Anggun dalam Go?

Linda Hamilton
Lepaskan: 2024-12-10 06:48:12
asal
397 orang telah melayarinya

How to Gracefully Handle Dead RabbitMQ Connections in Go?

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")
            }
        }
    }
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan