質問

複数のクライアントがSocketioを使用して共通のチャットルームに接続するNodeJSチャットアプリがあります。おそらく異なるマシンで、これを複数のノードプロセスにスケーリングしたいと思います。ただし、同じ部屋に接続するクライアントは、同じノードプロセスにヒットすることは保証されません。たとえば、ユーザー1はノードプロセスAとユーザー2がノードプロセスBを押します。同じ部屋にいるため、ユーザー1がメッセージを送信すると、ユーザー2が入手できます。接続が異なるプロセスによって管理されているため、これを実現するための最良の方法は何ですか?

ノードプロセスをRedisに接続するだけだと考えました。これは少なくとも意志を処理する問題を解決します 知る 部屋には別のユーザー、ユーザー2がいますが、それでもできません 送信 プロセスBがその接続を制御するため、ユーザー2に。 Redisの「Value変更」コールバックを登録する方法はありますか?

私は、ルーティングやロードバランスのいずれも制御できないサーバー環境にいます。

役に立ちましたか?

解決

両方のnode.jsプロセスは、redisを介してあるチャネルにサブスクライブできます パブ/サブ そして、このチャネルに渡すメッセージを聞いてください。たとえば、ユーザー1が最初のマシンでAを処理するために接続すると、このユーザーに関するRedis情報と、マシンが管理するプロセス情報とともに保存できます。次に、2番目のマシンのプロセスBに接続されているユーザー2がユーザー1にメッセージを送信すると、このチャネルに公開し、ユーザー1との通信を管理する責任があるマシンを確認し、それに応じて応答できます。

他のヒント

私はこれについていくつかの研究をしました(しました)。私の発見の下:

Yojimbo87が言ったように、最初にRedis Pub/Sub(非常に最適化されています)を使用するだけです。

http://comments.gmane.org/gmane.comp.lang.javascript.nodejs/22348

ティム・キャスウェルは書いた:

ボトルネックは、実際のチャネルではなく、データのシリアル化と除去であることが私の経験でした。名前付きパイプを使用できると確信していますが、APIが何であるかはわかりません。 MSGPACKは、データインターチェンジに適した形式のようです。その上にMSGPACKまたはIPCフレームワークを実装するいくつかのライブラリがあります。

しかし、シリアル化 /脱介入があなたのボトルネックになるとき、私は使用しようとします https://github.com/pgriess/node-msgpack. 。また、これをテストしたいと思います。なぜなら、これを早ければ早いほど良いと思うからです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top