首頁 >後端開發 >Golang >如何在 Go 中優雅地處理死掉的 RabbitMQ 連結?

如何在 Go 中優雅地處理死掉的 RabbitMQ 連結?

Linda Hamilton
Linda Hamilton原創
2024-12-10 06:48:12398瀏覽

How to Gracefully Handle Dead RabbitMQ Connections in Go?

在Go 中偵測失效的RabbitMQ 連結

在這種情況下,使用streadway/amqp 函式庫用Go 編寫的消費者腳本在以下情況下無法退出: RabbitMQ 伺服器已停止。此外,一旦伺服器重新啟動,消費者就會停止接收訊息。

解決方案:使用連線通知

amqp.Connection 類型有一個 NotifyClose() 方法,該方法提供了用於發送傳輸或協定錯誤訊號的通道。透過使用此方法,我們可以處理連接斷開事件並優雅地處理它們。

以下程式碼片段示範如何使用連線通知來偵測死連線並執行必要的操作:

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

在這個修改後的腳本中,我們將主要的消費者邏輯包裝在一個循環中,此循環使用通知通道持續檢查連線關閉。如果收到錯誤,它會記錄錯誤,然後進程重新連線。

透過利用連線通知,我們可以偵測失效的 RabbitMQ 連線並採取適當的操作,例如重新連線、記錄錯誤或終止腳本。

以上是如何在 Go 中優雅地處理死掉的 RabbitMQ 連結?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn