ホームページ >バックエンド開発 >Golang >Go でデッド RabbitMQ 接続を検出して処理する方法?

Go でデッド RabbitMQ 接続を検出して処理する方法?

DDD
DDDオリジナル
2024-12-03 05:34:09380ブラウズ

How to Detect and Handle Dead RabbitMQ Connections in Go?

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。