ホームページ  >  記事  >  バックエンド開発  >  Go の AMQP 接続はグローバルにする必要がありますか、それともメッセージごとに作成する必要がありますか?

Go の AMQP 接続はグローバルにする必要がありますか、それともメッセージごとに作成する必要がありますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-28 08:51:29622ブラウズ

 Should AMQP Connections in Go be Global or Created for Each Message?

AMQP Dial での接続の管理

Go では、amqp.Dial 関数を使用して AMQP サーバーへの接続を確立します。ただし、メッセージを送信するたびに amqp.Dial 関数を呼び出す必要があるのか​​、それともグローバルに宣言して複数の操作に再利用できるのかという懸念があります。

グローバル接続管理

公式ドキュメントで述べられているように、TCP 接続の確立にはリソースが大量に消費される可能性があります。パフォーマンスを最適化するために、チャネルの概念が AMQP に導入され、単一の接続上で複数のチャネルを作成できるようになりました。

したがって、一般的に AMQP 接続はグローバル変数として 1 回だけ作成することをお勧めします。後続のすべての操作でそれを再利用します。これにより、毎回の新しい接続の確立に伴うオーバーヘッドが軽減されます。

スレッド セーフ

amqp.Dial 関数はスレッド セーフであり、複数の goroutine から同時に呼び出すことができます。これにより、必要に応じて、競合状態を発生させることなく複数の接続を作成できます。

接続障害の処理

接続障害を適切に処理するには、Connection を使用できます。 NotifyClose メソッドを使用して、接続が閉じられたときに通知を受け取るチャネルを登録します。これにより、必要に応じて検出して再接続できるようになります。

この例では、コードはチャネルをリッスンし、エラーが発生した場合に接続の再確立を試みます。ただし、既存の接続を切断してメッセージを公開しようとすると、エラーが発生します。これは、既存のチャネルが閉じられた接続への参照を保持していることが原因である可能性があります。

この問題を解決するには、接続を再確立するときに、予期しない動作を避けるためにアクティブなチャネルもすべて閉じる必要があります。

エラー処理の例

接続失敗の処理を組み込んだ例を次に示します。

<code class="go">import (
    "context"
    "log"
    "sync"
    "time"

    "github.com/streadway/amqp"
)

var (
    connOnce sync.Once
    conn     *amqp.Connection
)

func main() {
    connOnce.Do(func() {
        var err error
        conn, err = amqp.Dial("amqp://guest:guest@localhost:5672/")
        if err != nil {
            log.Panicf("Failed to connect: %v", err)
        }
    })

    c := make(chan *amqp.Error)
    conn.NotifyClose(c)

    go func() {
        for {
            err := <-c
            log.Println("reconnect: " + err.Error())
            connOnce.Do(func() {
                var err error
                conn, err = amqp.Dial("amqp://guest:guest@localhost:5672/")
                if err != nil {
                    log.Panicf("Failed to connect: %v", err)
                }
            })
            conn.NotifyClose(c)
            // Give time for any pending messages to be delivered
            // after reconnection
            time.Sleep(5 * time.Second)
        }
    }()

    // Create channels and perform operations here
    // ...

    // Close the connection when done
    defer conn.Close()
}</code>

この例では、sync.Once を使用してグローバル接続が作成されます。と入力して、確実に 1 回だけ初期化されるようにします。 Connection.NotifyClose メソッドは、接続の失敗を監視し、必要に応じて接続を再確立するために使用されます。

以上がGo の AMQP 接続はグローバルにする必要がありますか、それともメッセージごとに作成する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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