ホームページ > バックエンド開発 > Golang > Go でデッド RabbitMQ 接続を適切に処理する方法

Go でデッド RabbitMQ 接続を適切に処理する方法

Linda Hamilton
リリース: 2024-12-10 06:48:12
オリジナル
386 人が閲覧しました

How to Gracefully Handle Dead RabbitMQ Connections in Go?

Go でのデッド RabbitMQ 接続の検出

このシナリオでは、streadway/amqp ライブラリを使用して Go で記述されたコンシューマ スクリプトは、次の場合に終了に失敗します。 RabbitMQ サーバーが停止しています。さらに、サーバーが再起動されると、コンシューマはメッセージの受信を停止します。

解決策: 接続通知の使用

amqp.Connection タイプには、トランスポートまたはプロトコルのエラーを通知するためのチャネル。このメソッドを使用すると、接続ドロップ イベントを処理し、それらを適切に処理できます。

次のコード スニペットは、接続通知を使用して切断された接続を検出し、必要なアクションを実行する方法を示しています。

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート