在 RabbitMQ 消費者腳本中,偵測與 RabbitMQ 伺服器的連線何時失效至關重要。否則,消費者可能無法接收訊息,甚至無限期地繼續運作。
RabbitMQ 消費者腳本中使用的 Streadway/amqp 庫提供了一種嘗試保持連接活動的心跳機制。但是,僅依靠心跳間隔可能不足以可靠地檢測死連接。
相反,更可靠的方法涉及使用 amqp.Connection 物件的 NotifyClose() 方法。此方法傳回一個在發生傳輸或協定錯誤時發出訊號的通道:
import "github.com/rabbitmq/amqp091-go" func main() { conn, err := amqp.Dial(...) notify := conn.NotifyClose(make(chan *amqp.Error)) ... }
在main 函數內,每當建立或重新建立連線時,您應該建立一個新的通知通道並啟動一個選擇監視錯誤通道和訊息通道的語句。如果錯誤通道上收到錯誤,則表示連線已斷開,腳本應嘗試重新連線。
以下是如何實現此重新連接循環的範例:
for { conn, _ := amqp.Dial(...) notify := conn.NotifyClose(make(chan *amqp.Error)) ch, _ := conn.Channel() msgs, _ := ch.Consume(...) for { select { case err := <-notify: // Handle connection error and reconnect case d := <-msgs: // Handle incoming message } } }
透過使用NotifyClose() 持續監視連線的錯誤通道,您可以確保您的使用者腳本保持回應並正常處理連接故障。這樣,腳本將在必要時自動重新連接到 RabbitMQ 伺服器,從而降低遺失訊息或過早停止的風險。
以上是Go 消費者如何可靠地偵測和處理失效的 RabbitMQ 連結?的詳細內容。更多資訊請關注PHP中文網其他相關文章!