1

私はsocket.ioから始めようとしていますが、これはより理論的な質問です.socket.ioで特定のユーザーにメッセージを送信したいとしましょう.送信時に、socketid を取得して送信します。

しかし、複数のサーバー プロセスを実行している場合はどうなるでしょうか。クライアントが実際に接続されている正しいサーバーが送信を行うことを確認する必要があります。出来ますか ?

4

2 に答える 2

1

問題は通常、WebSocket クラスターで遊ぶ方法に関するものです。

  • 各クライアントとの双方向接続の処理を担当する複数のフロントエンド サーバー。それらは WebSocket クラスターを形成します。
  • アプリケーションのビジネス ロジックの処理を担当する複数のバックエンド サーバー。

バックエンドがクライアントに通知するたびに、クライアントとの通信を担当する WebSocket クラスターに要求を送信します。考えられるシナリオ:

  • 各 WebSocket クラスターのサーバーを一意の ID で識別します。
  • 各クライアントを一意の ID で識別します。
  • クライアントが WebSocket クラスターのサーバーの 1 つに接続するたびに、その一意の ID をサーバーの一意の ID と共に分散キー/値のようなデータベースに保存します。
  • したがって、どのクライアントがどのサーバーに接続されているかがわかります。
  • 次にバックエンド アプリケーションがクライアントに通知する場合、次の 2 つの可能性があります。
    1. ペア (clientId、serverId) がデータベースに存在しないため、クライアントに通知できません。
    2. ペア (clientId、serverId) がデータベースに存在する場合、serverId で識別されるサーバーに依頼して、clientId で識別されるクライアントに通知する必要があります。

ノート:

  • 各 WebSocket クラスターのサーバーは、socket.io で強化された node.js インスタンスを実行できます。clientId をパラメーターとして取り、socket.io を使用してこのクライアントに通知するルートを提供する必要があります。実際、socket.io は、どのクライアントがこのサーバーのどのソケットを使用しているかを認識しています。
  • サーバーがクラッシュするたびに、データベースをクリーンアップし、サーバー ID を含むすべてのペアを削除する必要があります。
  • WebSocket クラスターのデプロイは面倒な場合があるため、Kaazingなどの商用オファーがあります。
  • データベースのような優れた分散キー/値はRiakです。上記の目的では、Redis や Memcached よりも優れています。これは、データ センターおよび複数のデータ センターに簡単に分散できるためです。
于 2013-01-17T14:55:23.783 に答える
1

複数のサーバー インスタンスの場合、認証用のキャッシング サービス (memcache、redis) と、すべてのノード インスタンスがバインドされる中央メッセージ キュー サービス (stormMQ、rabbitMQ、AQ、Java ベースの mq) が必要です。したがって、Node インスタンスは各クライアント/チャネル/その他のメッセージ キューにバインドし、バインドされた他のすべての Node インスタンスはメッセージを受信して​​クライアントに転送します。

于 2013-01-17T12:06:33.163 に答える