9

私は、各チャットルームの大規模なグループ(> 50ユーザー)を特に対象としたリアルタイムのグループチャットアプリケーションを設計しようとしています。すべてのユーザーが一度にアクティブにチャットするわけではありませんが、チャットルームにチャットが入ると、多くのユーザーが単にアイドル状態/リッスンして更新を受信することが期待できます。

私はクラウド指向ではないプロトタイプを作成し、クラウドベースのシステム用に再設計中です。

一連のバックエンドの「チャット」サーバー(CServer)にリダイレクトする「リダイレクト/負荷分散」サーバー(LBServer)が1つあると思います。ユーザーがクライアントから特定のチャットルームへの参加を要求すると、クライアントはLBServerに接続し、LBServerはチャットルームのインスタンスをメモリに保持している特定のCServerの接続情報で応答します。次に、クライアントはLBServerから切断し、CServerに接続します。CServerへのこの接続は、ユーザーがチャットルームにいる限り維持されます。CServerは、チャットルームの状態をログに記録するバックエンドデータベースを更新するだけでなく、CServerに接続している他のクライアントにチャットルームの更新を通知する役割を果たします。

1つのチャットルームに存在するユーザーが多すぎる場合(したがって、1つのCServerがこれらすべてのユーザーへの永続的な接続を維持する必要がある)、部屋のアクティビティがCServerの処理速度のしきい値を超えて増加すると、「ホットスポット」シナリオが展開されることをすでに想像できます。すべての更新に対応します。

この時点で、システムをスケーラブルにするための1つの単純なソリューションを考え出しました。より大きなCServerインスタンスをロードし、チャットルームの状態をコピーして、「ホット」CServerのすべてのユーザーに新しいより大きなインスタンスに再接続するように要求できます。これがそのようなシステムのスケーラビリティを処理する正しい方法であるとは思いません。

少し質問があります:

チャットのリアルタイム性を望んでいることを考えると、1つのサーバーインスタンスへの接続を維持する必要がないようにバックエンドシステムを設計するためのより適切な方法はありますか?

すでにデータベイの状態を追跡しているときに、各チャットルームの処理をすべて1つのCServerで実行するように分離する必要がありますか?ユーザーが複数のチャットルームに同時に参加できるように、部屋を空けておきたいです。現在のモデルを使用する場合、クライアントはクラウドへの複数の接続を維持する必要があります(ユーザーがいるチャットルームごとに1つ)。これはクライアント側にとっては最悪です。改訂版として、ユーザーが現在使用しているチャットルームの変更をリッスンし、それに応じて更新する「ユニバーサル」CServerへの接続を維持するクライアントを想定しています。

すべてのフィードバックと入力をいただければ幸いです。不明な点について詳しく説明させていただきます。ありがとう。

4

3 に答える 3

4

IRC http://en.wikipedia.org/wiki/Internet_Relay_Chatがどのように 単純なマルチキャストを行うかを確認することをお勧めします。IRC にはスケーラビリティの問題と設計上の問題があるようですが、それでも通常は驚くほどうまく機能します。IRC プロトコルの問題の 2 つは、1) ネットワークがサーバーのツリーにかなりの信頼を置いていること、2) ネットワーク状態の変更にはクライアントの分割/結合が必要であることです。RFC およびその他の技術については、http ://www.irc.org/techie.html を参照してください。

この比較http://en.wikipedia.org/wiki/Comparison_of_instant_messaging_protocolsには、PSYC (同期会議のプロトコル – 私は聞いたことがない) も含まれており、おそらく IRC プロトコルの問題のいくつかが修正されています: http://about .psyc.eu/はじめに

XMPP http://fi.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocolもありますが、これはマルチキャストを行わず、MSN/Google トーク タイプの 1 対 1 のチャットにより適している可能性があります。 Erlang) は、Google トークに加えて使用します。

Erlang http://en.wikipedia.org/wiki/Erlang_(programming_language ) について言えば、並行性についてはアクター モデルhttp://en.wikipedia.org/wiki/Actor_modelに従っており、分散性とスケーラビリティに役立ちます。Scala、Common Lisp、Python、Haskell などの他の言語も、ネイティブまたはライブラリを通じて Actor モデルをサポートしています。

PS。私はチャット プロトコルの設計の専門家であるとは主張していません。たまたまネットワーク プロトコルについて 1 つまたは 2 つ知っているだけで、最近、並行プログラミング手法について趣味で研究を行っています...

于 2011-05-31T21:06:04.533 に答える
4

ここにはいくつかの設計上の考慮事項があると思います。

  1. 各チャットルームが DNS のサブエントリとして表示されるようにすることを検討してください。たとえば、chatroom1.chatservice.com です。そうすれば、サーバー間で負荷を分散し、安定した状態を保つことができます。

  2. チャット サーバーは、マルチキャストを介して相互に通信でき、スケールを提供するためにメッセージの送信者と受信者を切り離すことができます。

  3. 永続的な接続を維持する必要はありませんが、通信のストリームには、ルーティングの役割を処理できるトークンが含まれている必要があります。

ジェームズ・マクガヴァン HP

于 2011-05-25T18:13:25.337 に答える
0

いくつかの MOM トピックとサブスクライバー モデルを利用できると思います。

  1. チャットルームだけのトピックベースキューを作成できます。

  2. ユーザーは加入者に他なりません。RabitMQ/ActiveMQ が役に立ちます。

  3. また、DWR を使用してリバース AJAX またはサーバー プッシュを使用することもできます。

  4. CSQL/SQLite などのメモリ内データベースをキャッシュして、パフォーマンスを向上させることができます。

  5. ユーザーとそのチャット ルーム マッピングをデータベースに入れることができます。

于 2011-06-07T14:20:33.610 に答える