3

これが私の問題です:

私のアプリケーションは、Web アプリケーション用の分散リアルタイム メッセージ ブローカーです。Web ブラウザーからのクライアントは、アプリケーション ノードの 1 つに接続します。ZeroMQ PUB/SUB メカニズムによって接続されたノード。1 つのクライアントがメッセージを送信すると、ノードはそれを PUB ソケットにパブリッシュし、他のノードはそれらのメッセージを SUB ソケットから受信し、接続されている独自のクライアントに送信します。

しかし、今はプレゼンスと履歴機能が必要です。プレゼンス - (すべてのノードに) 接続されているすべてのクライアントの説明を含むリストを提供します。履歴 - 最近送信されたいくつかのメッセージのリストを提供します。つまり、アプリケーションの状態全体を取得する必要があります。私はそれを達成するためにいくつかの方法を考えています:

1) 接続されたクライアントに関するすべての情報を中央サーバーに送信します。次に、クライアントがプレゼンスを要求すると、中央サーバーに要求し、応答をクライアントに返します。

2) すべての情報をすべてのノードに保持します。クライアントが任意のノードに接続すると、それに関する情報を他のノードに送信します - PUBLISH 操作を使用します。そのため、クライアントがプレゼンスを要求すると、すぐに応答を返すことができます。

3) すべてのノードから必要に応じて情報を収集します。現時点ではこれをどのようにプログラムするか想像できませんが、これにより重複する情報を取り除くことができ、メモリ消費の削減につながります。この場合、すべての情報をメモリに収めることについて心配する必要はありません。

4) Doosrdのような分散データ ストアを使用します。しかし、余分な依存関係があるため、このアイデアは好きではありません。

クライアントは、ノードへの接続ごとにプレゼンス情報を必要とし、クライアントの接続/切断ごとにプレゼンス情報が変更され、メッセージごとに履歴情報が変更されます。

これはオープンソースのアプリケーションであるため、接続されたクライアントの数をサポートする必要があるかどうかはわかりません。最終的にロード テストを実行すると、この数値が表示されます。

これらのプレゼンスおよび履歴データの信頼性について、強い要件はありません。

私は本当にあなたのアドバイスが必要です.これらのオプションのどれが私の問題を解決する正しい方法ですか. または、別のより良い方法がありますか?

4

2 に答える 2

2

基本的に、すべてのオプションは特定の状況で有効なオプションです。

特定の要件がなければ、最も単純なソリューションを使用します。

最も簡単な解決策は、Redis のようなものを使用することだと思います。これは安定しており、多くの企業 (私の知る限り SO を含む) で使用されています。非常に高速で柔軟性があり、履歴の上限付きリストを簡単に実装できます。機能をすばやく変更できるため、要件を反復するのは非常に簡単です。

余分な依存関係/展開が必要ない場合の別のオプションは、サーバー間で情報を分割することです (ハッシュ分割または一貫したハッシュを使用)。これにより、特定のクライアントまたは別のエンティティに関する情報を保存/取得する場所がわかります。

HTH

于 2013-07-25T01:01:52.337 に答える