Go でのデッド RabbitMQ 接続の検出と処理
提供された RabbitMQ コンシューマ スクリプトでは、RabbitMQ サーバーの操作が中断されるとスクリプトが実行されたままになります。しかしメッセージには無反応。これに対処するには、切断された接続を検出し、再接続するかスクリプトを終了することが重要です。
基盤となるライブラリである streadway/amqp が解決策を提供します。 amqp.Connection タイプには、チャネル シグナリング トランスポート エラーまたはプロトコル エラーを返す NotifyClose() メソッドがあります。このチャネルを使用すると、接続エラーを検出できます。
接続エラー処理を組み込んだスクリプトの更新バージョンは次のとおりです。
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") } } } }
この改訂されたスクリプトでは、接続ループは他の操作。メッセージ受信ループ内で、select ステートメントはエラー チャネルと受信メッセージの両方をチェックします。接続エラーが検出された場合、エラーをログに記録し、再接続をトリガーします。このメカニズムにより、スクリプトは一時的な接続の問題から回復し、通常の動作を再開できるようになります。
以上がGo でデッド RabbitMQ 接続を検出して処理する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。