Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mengesan dan Mengendalikan Sambungan RabbitMQ Mati dalam Go?

Bagaimana untuk Mengesan dan Mengendalikan Sambungan RabbitMQ Mati dalam Go?

DDD
DDDasal
2024-12-03 05:34:09380semak imbas

How to Detect and Handle Dead RabbitMQ Connections in Go?

Mengesan dan Mengendalikan Sambungan RabbitMQ Mati dalam Go

Dalam skrip pengguna RabbitMQ yang disediakan, gangguan dalam operasi pelayan RabbitMQ menyebabkan skrip berjalan tetapi tidak bertindak balas terhadap mesej. Untuk menangani perkara ini, adalah penting untuk mengesan sambungan mati dan sama ada menyambung semula atau menamatkan skrip.

Pustaka asas, streadway/amqp, menawarkan penyelesaian. Jenis amqp.Connection mempunyai kaedah NotifyClose() yang mengembalikan ralat pengangkutan isyarat saluran atau protokol. Dengan menggunakan saluran ini, adalah mungkin untuk mengesan kegagalan sambungan.

Berikut ialah versi terkini skrip yang menggabungkan pengendalian ralat sambungan:

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

Dalam skrip yang disemak ini, gelung sambungan membalut operasi lain. Dalam gelung terima mesej, pernyataan pilih menyemak kedua-dua saluran ralat dan mesej masuk. Jika ralat sambungan dikesan, ia mencatat ralat dan mencetuskan penyambungan semula. Mekanisme ini memastikan bahawa skrip boleh pulih daripada isu sambungan sementara dan menyambung semula operasi biasa.

Atas ialah kandungan terperinci Bagaimana untuk Mengesan dan Mengendalikan Sambungan RabbitMQ Mati dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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