NATS中国語開発文書:自動再接続

11811 ワード

何らかの理由で接続が切断されると、ほとんどの(すべてでない場合)クライアント・ライブラリがNATSシステムに再接続されます.再接続ロジックはライブラリによって異なる場合がありますので、クライアントライブラリのドキュメントを参照してください.
通常、クライアントは、connectコールで提供されたurlまたはNATSシステムが初期の接続中に提供したurlを介して、知っているサーバに再接続しようとします.この機能により、NATSアプリケーションとNATSシステム自体の自己修復と再構成が可能になり、他の構成や介入を必要としません.このライブラリには、再接続動作の制御、再接続ステータスの通知、新しいサーバの通知を支援するいくつかのオプションがあります.
再接続禁止
接続オプションを使用すると、自動再接続を無効にできます.
// Disable reconnect attempts
nc, err := nats.Connect("demo.nats.io", nats.NoReconnect())
if err != nil {
     
    log.Fatal(err)
}
defer nc.Close()

// Do something with the connection

再接続回数の設定
アプリケーションは、各サーバの最大再接続試行回数を設定できます.これには、クライアント接続呼び出しに提供されるサーバと、クライアントが別のサーバを介して発見したサーバが含まれます.サーバへの再接続に失敗した操作が指定された回数連続して失敗すると、接続リストから削除されます.サーバへの再接続に成功すると、クライアントはサーバの再接続に失敗した試行数をリセットします.サーバが接続リストから削除されている場合は、接続時に再認識できます.これにより、接続試行数も効果的にリセットされます.クライアントが再接続するサーバがない場合は、接続が閉じられ、エラーが発生します.
// Set max reconnects attempts
nc, err := nats.Connect("demo.nats.io", nats.MaxReconnects(10))
if err != nil {
     
    log.Fatal(err)
}
defer nc.Close()

// Do something with the connection

Thundering Herdを避ける
サーバがダウンタイムした場合、すべてのクライアントがすぐに再接続しようとし、サービス拒否攻撃をもたらす可能性のある逆モードがThundering Herdと呼ばれます.これを防ぐために、ほとんどのNATSクライアント・ライブラリは、接続しようとするサーバをランダム化します.1台のサーバのみを使用する場合、この設定は無効ですが、クラスタ化、ランダム化、またはシャッフルの場合、クライアントの再接続試行の衝撃に耐えられるサーバが1台もないことを確認します.ただし、[接続](Connect)と[再接続](Restach)のランダム化プロセスを無効にして、常に同じ順序でサーバをチェックする場合は、ほとんどの接続オプションのあるライブラリでこの操作を実行できます.
servers := []string{
     "nats://127.0.0.1:1222",
    "nats://127.0.0.1:1223",
    "nats://127.0.0.1:1224",
}

nc, err := nats.Connect(strings.Join(servers, ","), nats.DontRandomize())
if err != nil {
     
    log.Fatal(err)
}
defer nc.Close()

// Do something with the connection

再接続試行中に一時停止
同じサーバに何度も接続してみるのはあまり意味がありません.このようなジッタと無駄な再接続を防止するために、特にTLSを使用する場合、ライブラリは待機設定を提供する.通常、クライアントは、同じサーバへの再接続を2回試みた間に少なくとも一定の時間が経過したことを確認します.実装は、使用するライブラリによって異なります.この設定は、クライアント・リソースの浪費を防止するだけでなく、他のサーバが使用できない場合にも驚きの効果を緩和します.
// Set reconnect interval to 10 seconds
nc, err := nats.Connect("demo.nats.io", nats.ReconnectWait(10*time.Second))
if err != nil {
     
    log.Fatal(err)
}
defer nc.Close()

// Do something with the connection

リスニング再接続イベント
reconnectがカプセル化されているため、多くのライブラリでは、再接続イベントの通知を受信するためにイベントリスナーが提供されています.このイベントは、大量のメッセージを送信するアプリケーションにとって特に重要です.
// Connection event handlers are invoked asynchronously
// and the state of the connection may have changed when
// the callback is invoked.
nc, err := nats.Connect("demo.nats.io",
    nats.DisconnectErrHandler(func(nc *nats.Conn, err error) {
     
        // handle disconnect error event
    }),
    nats.ReconnectHandler(func(nc *nats.Conn) {
     
        // handle reconnect event
    }))
if err != nil {
     
    log.Fatal(err)
}
defer nc.Close()

// Do something with the connection

再接続間でメッセージをバッファリングする
NATSクライアントライブラリの差は少なく、すぐに廃棄されます(be fire and forget.).使用しているライブラリに含まれる機能の1つは、接続が切断されたときに送信メッセージをバッファリングする機能です.クライアントは、サーバがオフラインであるため、クライアントにキャッシュされるため、短時間の再接続中にアプリケーションがメッセージを発行できるようにします.再接続すると、ライブラリからこれらのメッセージが送信されます.最大再接続バッファに達すると、クライアントはメッセージをパブリッシュせず、エラーを返します.メッセージはアプリケーションに送信されたようですが、接続が再生成されていないため、送信されていない可能性があります.アプリケーションは、確認などのモードを使用して、納品を確保する必要があります.この機能をサポートするクライアントでは、バイト、メッセージ、または両方を使用してバッファのサイズを設定できます.
// Set reconnect buffer size in bytes (5 MB)
nc, err := nats.Connect("demo.nats.io", nats.ReconnectBufSize(5*1024*1024))
if err != nil {
     
    log.Fatal(err)
}
defer nc.Close()

// Do something with the connection