1

node.jsアプリケーションを構築しています。ユーザーが接続すると、状態がオンラインとして送信されます。それらが切断されると、状態はオフラインに切り替わります。また、ユーザーが接続すると、接続のリストと、これらの友達の状態(オンラインまたはオフライン)が表示されます。わかりました、すばらしいです。これで問題ありません。

しかし、私が直面している問題は、ログイン中にユーザーの友達の状態を動的に送信する方法です。したがって、手順は次のようになります。

  1. ログインします。
  2. すべての友達のリストを取得します:user1、user2、user3
  3. すべてのユーザーの状態のリストを取得します:user1:online、user2:online user3:offline
  4. user1はログオフします
  5. ユーザー1の状態変化を動的に取得するにはどうすればよいですか?

これらのユーザーは相互に接続されていないことを忘れないでください。また、ユーザーの状態は、彼を友達として持っている他のすべてのユーザーに送信する必要があることも忘れないでください。user1には100人の友達がいて、私もその1人だとしましょう。私は(他の99人と一緒に)user1がオフラインになったことを通知する必要があります。また、これらのユーザーが同じ物理サーバー上にいない場合もあることに注意してください(複数のサーバーがそれぞれX個の接続を処理します)。この問題を解決するための最良の理論的方法は何ですか?

私が思いついた唯一の答えは、状態をDBに保存すると、そのノードがdbにクエリを実行し、状態が変化すると更新されるということです。しかし、ノードがデータベースへの変更を監視する必要があり、それがスケーリングできないのはおかしいようです。これを行うためのより良い方法が必要です-おそらくそれは明白な方法であり、私はそれを見逃しています。

4

1 に答える 1

3

コメントでebohlmanが示唆しているように、パブリッシュ/サブスクライブパターン(「pub / sub」とも呼ばれます)は、問題に当てはまるように聞こえます。pub / subアーキテクチャでは、パブリッシャーが特定のクライアントにメッセージを送信する代わりに、パブリッシャーは中央のpub/subサーバーにメッセージを送信します。サブスクライバーは、関心のあるメッセージの種類、つまり「トピック」についてこのサーバーに通知します。重要なのは、パブリッシャーとサブスクライバーがお互いを知らない、または気にしないことで、パターンを非常にスケーラブルにすることです(任意の数のパブリッシャーまたはサブスクライバー)。

パブリッシュ/サブスクライブパターン

あなたの場合、ユーザーのログイン/ログアウトを処理する各サーバーは、「login_changed」トピックにサブスクライブする可能性があります。ユーザーがログインまたはログアウトするたびに、変更を処理したサーバーは、トピック「login_changed」と、誰に何が起こったかを示すデータ(JSONでエンコードされた文字列など)を含むメッセージをpub/subサーバーに送信します。「login_changed」トピックにサブスクライブしている各サーバーはメッセージを受信し、問題のユーザーの追跡を担当しているかどうかをそれぞれ判断できます。

pub/subパターンを管理するための一般的なツールがいくつかあります。一般的なKey-ValueストアであるRedisは、 pub / subをサポートしており、このタスクで個人的に気に入っているツールです。AMQPは、pub / subを含む多くの種類のメッセージング関連の動作を含むオープンスタンダードであり、多くの実装があり、その中で最も一般的なのはおそらくRabbitMQです。HTTPを介してWebクライアントを接続することに興味がある場合は、 Fayeのようなものに興味があるかもしれません。このテーマに関する多くの文献があり、多くの言語での多くの実装もあります。グーグル検索はあなたを遠くに連れて行くはずです。

于 2012-06-03T01:02:07.377 に答える