2

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

私が調査しようとしているオプション:

  1. Redis / Zookeeper / Doozer - 各サーバー インスタンスはそれ自体を構成サーバーに登録し、接続されているすべてのサーバーは構成の変更に応じて構成の更新を受け取ります。じゃあ何?
    1. 各サーバー インスタンスとのエンド ツー エンド接続を維持し、送信データごとにリストを反復処理しますか?
    2. 一部のカスタム UDP マルチキャストですが、その上に独自の信頼性を追加する必要があります。
  2. カスタム メッセージ ブローカー - 各サーバーが接続して通知するときにレジストリを実行および維持するサービス。各サーバーとの接続を維持してデータを受け入れ、それを他のサーバーに再ブロードキャストします。
  3. 各サーバー インスタンスが直接ブロードキャストするだけで、名簿が維持されない、信頼性の高い UDP マルチキャスト トランスポート。

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

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

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

* 目標の編集 *

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

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

*質問の要約を更新*

複数のサーバー/複数のエンドポイントがあり、相互にパブリッシュ/サブスクライブする必要がある場合、それらの間の推奨される通信モードは何ですか? 検出されたサーバーの名簿にメッセージを再発行するための 1 つ以上のメッセージ ブローカー? 各サーバーから直接、信頼できるマルチキャスト? 分散システムで複数のエンドポイントを接続し、遅延を低く、高速で、配信の信頼性を維持するにはどうすればよいでしょうか?

4

1 に答える 1

2

クライアントに面するすべてのエンドポイントが同じ LAN 上にあると仮定すると (これは、スケーリングの最初の合理的なステップである可能性があります)、信頼できる UDP マルチキャストにより、発行エンドポイントからクライアントを持つ任意のエンドポイントに発行メッセージを直接送信できます。チャンネル登録しました。これはまた、永続的なストレージ層を介してデータをプロキシするよりもはるかに優れた低遅延要件を満たします。

マルチキャスト グループ

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

信頼性の高い UDP マルチキャスト

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

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

永続ストレージ

データを長期間保存することになった場合、ストレージ サービスはエンドポイントと同じようにマルチキャスト グループに参加できますが、メッセージをクライアントに送信するのではなく、データベースに保存します。

于 2011-09-20T20:21:31.387 に答える