udp - 分散サーバーのインスタンス間のデータブロードキャスト

udp go multicast apache-zookeeper service-discovery

特定のアプリケーションでのサービス「名簿」の推奨事項についてフィードバックを得ようとしています。クライアントとの永続的なソケット接続を維持するサーバーアプリがあります。分散インスタンスをサポートするサーバーをさらに開発したいと考えています。サーバー "A"は、他のオンラインサーバーインスタンスにデータをブロードキャストできる必要があります。他のすべてのアクティブなインスタンスについても同様です。

私が研究しようとしているオプション:


Redis / Zookeeper / Doozer-各サーバーインスタンスはそれ自体を構成サーバーに登録し、接続されているすべてのサーバーは変更時に構成の更新を受け取ります。それで?

各サーバーインスタンスとのエンドツーエンド接続を維持し、各送信データでリストを反復処理しますか?
一部のカスタムUDPマルチキャストですが、その上に独自の追加の信頼性を追加する必要があります。

カスタムメッセージブローカー-各サーバーが接続して通知するときにレジストリを実行および維持するサービス。各サーバーとの接続を維持して、データを受け入れ、それを他のサーバーに再ブロードキャストします。
各サーバーインスタンスが直接ブロードキャストするだけで、名簿が維持されない、信頼性の高いUDPマルチキャストトランスポート。


ここに私の懸念があります:


ZookeeperやDoozerなどの外部アプリに依存しないようにしたいのですが、最善の解決策であれば、明らかにそれらを使用します。
カスタムメッセージブローカーを使用すると、スループットのボトルネックになりたくありません。スケーリング時に複数のメッセージブローカーを実行し、ロードバランサーを使用する必要がある場合もあります。
自分で管理できれば、マルチキャストは外部プロセスを必要としませんが、それ以外の場合は、おそらくZMQを使用する必要があります。


私もメッセージの配信について話していることを理解していますが、それは私が行っているソリューションと連動しています。
ちなみに私のサーバーはGoで書かれています。スケーラビリティを維持するための最良の推奨方法に関するアイデアはありますか?

*目標の編集*

私が本当に求めているのは、分散サーバーのインスタンス間でブロードキャストデータを実装するための最良の方法は何であるかということです。


各サーバーインスタンスは、リモートクライアントとの永続的なTCPソケット接続を維持し、それらの間でメッセージを渡します。
メッセージは、関連するクライアント接続に配信できるように、実行中の他のインスタンスにブロードキャストできる必要があります。
メッセージングは​​高速になる可能性があるため、低遅延が重要です。
シーケンスと信頼性は重要です。


*更新された質問の要約*

複数のサーバー/複数のエンドポイントがあり、相互にpub / subする必要がある場合、それらの間の通信の推奨モードは何ですか?発見されたサーバーの名簿にメッセージを再発行する1つ以上のメッセージブローカー?各サーバーから直接信頼できるマルチキャストですか?
レイテンシを低く、速度を高く、配信の信頼性を維持しながら、分散システムの複数のエンドポイントをどのように接続しますか?
答え
すべてのクライアント側エンドポイントが同じLAN上にあると仮定すると(スケーリングの最初の合理的なステップとして使用できます)、信頼性の高いUDPマルチキャストにより、発行済みエンドポイントからクライアントを持つエンドポイントのいずれかに発行済みメッセージを直接送信できます。チャンネルに登録しました。これは、永続ストレージレイヤーを介してデータをプロキシするよりもはるかに優れた低レイテンシ要件を満たします。

マルチキャストグループ


中央データベース(たとえば、Redis)は、マルチキャストグループ(IP:PORT)<->チャネルのマ​​ップを追跡できます。
エンドポイントは、サブスクライブする新しいチャネルを持つ新しいクライアントを受信すると、データベースにチャネルのマ​​ルチキャストアドレスを要求し、マルチキャストグループに参加できます。


信頼できるUDPマルチキャスト


エンドポイントは、チャネルのパブリッシュされたメッセージを受信すると、そのチャネルのマ​​ルチキャストソケットにメッセージを送信します。
メッセージパケットには、マルチキャストグループごとのサーバーごとの順序付き識別子が含まれます。エンドポイントがサーバーから前のメッセージを受信せずにメッセージを受信した場合、エンドポイントは、ミスしたメッセージの「確認応答なし」メッセージを公開サーバーに送り返します。
公開サーバーは最近のメッセージのリストを追跡し、NAKされたメッセージを再送信します。
サーバーが1つのメッセージのみを送信し、サーバーに到達できないというエッジケースを処理するために、サーバーは、NAKキューの存続期間にわたってマルチキャストグループにパケット数を送信できます。「24個のメッセージを送信しました」サーバーは、以前のメッセージをNAKする機会があります。


PGMを実装したいだけかもしれません。

永続的なストレージ

最終的にデータを長期間保存すると、ストレージサービスはエンドポイントと同じようにマルチキャストグループに参加できますが、メッセージをクライアントに送信する代わりにデータベースに保存します。
関連記事

python - ソケットサーバーの実行中に別のコードを実行していますか?

networking - 大容量データ転送のUDPおよびTCPパフォーマンスをベンチマークするユーティリティ

c# - WAN上のTCP / UDPソケットサーバー

c++ - UDPソケットからIP情報を取得するにはどうすればよいですか(Windows C++)?

c++ - C++でクライアントサーバー接続のローカルネットワーク上のデバイスを検出する

qt - Qtネットワークブロードキャストの質問:送信者IPを取得するには

c# - ノンブロッキングUDPソケット.NET「ノンブロッキングソケット操作をすぐに完了できませんでした」例外

c# - UDPをTCPプロトコルにカプセル化する

c - UDP Cソケット:1つのポートを共有する複数のソケット

c++ - rawソケットのudpパケットフラグメンテーション