ホームページ  >  記事  >  バックエンド開発  >  amqp.Dial は Go での接続作成に対してスレッドセーフですか?グローバル接続とリクエストごとの接続に関する議論。

amqp.Dial は Go での接続作成に対してスレッドセーフですか?グローバル接続とリクエストごとの接続に関する議論。

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-28 12:23:02362ブラウズ

 Is amqp.Dial Thread-Safe for Connection Creation in Go? A Debate on Global vs. Per-Request Connections.

接続作成のための amqp.Dial in Go Lang のスレッド セーフティ

AMQP の TCP 接続の作成は、高コストの操作になる可能性があります。これに対処するために、チャネルが導入されました。ただし、接続を毎回作成するか、グローバルに一度宣言するかについて議論が生じています。

質問:

の main() 関数の最近の例Go アプリケーションは、メッセージがパブリッシュされるたびに接続の作成を示します。このアプローチでは、特に amqp.Dial の想定されるスレッドセーフな性質を考慮すると、接続が切断された場合にフェイルオーバー メカニズムを使用してグローバルに宣言された接続を持つ方が適切かどうかという問題が生じます。

答え:

リクエストごとに接続を作成することはお勧めできません。代わりに、接続をグローバル変数にするか、起動時に 1 回だけ初期化されるアプリケーション コンテキストの一部にすることを検討してください。

接続エラーを処理するには、amqp.Connection.NotifyClose を使用してチャネルを登録し、接続ステータスを監視できます。 。エラーが発生した場合は、再接続機能を使用して接続を再確立できます。

例:

<code class="go">import (
    "github.com/streadway/amqp"
)

func initialize() {
    c := make(chan *amqp.Error)
    go func() {
        err := <-c
        log.Println("reconnect: " + err.Error())
        initialize()
    }()

    conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
    if err != nil {
        panic("cannot connect")
    }
    conn.NotifyClose(c)

    // create topology
}</code>

以上がamqp.Dial は Go での接続作成に対してスレッドセーフですか?グローバル接続とリクエストごとの接続に関する議論。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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