3

Node.js/socket.io 環境で特定のユーザーの通知を収集するために pubsub を使用して、正しい方法で知識を得ていることを確認したいと思います。

これが私のセットアップです:

  • メイン アプリケーションは Codeigniter 上の PHP で書かれています。Auth は CI (Session など) の Ion_Auth を使用して処理されます。
  • リアルタイム (現在は通知のみ) は Node.js と Socket.io で処理されます
  • 認証されたユーザーは友人を「グループ」に招待できます - 招待者がすでにアカウントを持っている場合、招待は電子メールと内部通知の両方を送信します
  • 認証されたユーザーは、コメントを残したり、共有コンテンツに対してアクションを実行したりできます。どちらも、そのコンテンツを購読しているすべてのユーザーに通知されます。

これを処理する正しい方法は、各ユーザーが通知チャネルにサブスクライブすることだと思います。このチャネルには、すべてのユーザーのすべての通知が含まれており、上記のアクションのいずれかを実行するたびに発行される発行イベントによってチャネルにプッシュされます。次に、サブスクリプションは、このチャネルをチェックして、ユーザー セッションに関連する特定のデータを探します。

  • 招待に関連する通知の場合、公開されたイベントには一意に識別されるユーザー データが含まれており、それを確認します。
  • 特定のコンテンツに関連する通知については、そのコンテンツの識別マーカーを含む公開されたイベントのチャネルを確認します。

これは正しい方法ですか?私はsocket.io、node.js、およびpubsubにかなり慣れていませんが、これは私には理にかなっているようです. 私を投げかけている部分は、クライアントがサーバーからイベントをプルするのではなく、クライアントにイベントをプッシュする必要があるということです。このソリューションは両方を行うようです。

より単純な解決策 (つまり、socket.io によりネイティブなもの) があれば、洞察をいただければ幸いです。チュートリアルや例の方法で実際に見つけることができるのは、同じチャットクライアントの書き込みが何度も繰り返されていることだけです...

編集:または、接続されているすべてのクライアント ID のハッシュを対応するユーザー ID と一緒に維持し、新しいメッセージが着信したときに、そのメッセージを特定のクライアントに送信する方が実用的でしょうか?var socket = hash[userID]; socket.emit(message);

この場合、潜在的なボトルネックについて何か考えたことはありますか? サイトには、複数のイベントについて更新されている何千もの同時ユーザーが存在する可能性があります。

4

1 に答える 1

0

PubSub を自分で実装しないことをお勧めします。この種のブロードキャストを 1 回行う必要があり、RabbitMQ を使用して接続とルーティング (ブロードキャストを含む) を処理しました。

ブラウザーへのリアルタイム メッセージングは​​、リバース Ajax 呼び出しを使用して行われます (長時間保持された http 接続、Wikipedia の Comet を参照) 。

NodeのRabbitMQサーバーライブラリを参照してください

Rabbit MQ には多くの利点があります。

  • RabbitMQ が実行されている限り、クライアントはいつでもメッセージを投稿できます。
  • より多くのスループットが必要な場合 (スケールアウト) はいつでも、アプリケーション サーバーの別のインスタンスを起動することで、サーバーの範囲を簡単に設定できます。
  • RabbitMQ に送信されたメッセージは永続化できます。
  • RabbitMQ へのメッセージの投稿は、トランザクション内で行うことができます。
  • キューと交換を管理するための簡単なサーバー インターフェース。
于 2014-10-06T21:07:04.127 に答える