在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中文網其他相關文章!