2

この質問の断片を見てきましたが、直接答えるものはありません。

以下は仮想環境です。

  • HTTP 経由でクライアントと通信する 20 の Java セントリック サーバー (つまり、Tomcat / Glassfish / Jboss など)
  • サーバーの前にある HTTP ロード バランサーは、各クライアント接続で同じサーバーに戻ることが保証されていません。
  • それ以外は技術的に利用可能です。(JMS / Camel / Memcached / Hazelcast / 何でも)

Joe と彼のブラウザ (おそらく Flash や HTML5 などのクライアント テクノロジを使用) が、20 のサーバーすべてで利用可能な JMS トピックにパブリッシュされたすべてのメッセージを受信できるようにします。

例を次に示します。

  • Joe の最初の HTTP 接続がサーバー A に到達する
  • サーバー A には、Joe 用の HTTP セッションがあります (Cookie などを介して)
  • サーバーAは彼をトピックにサブスクライブします(セッションIDなどに基づいて)
  • Joe の HTTP 接続が終了します。
  • トピックにメッセージが投稿されます。
  • Joe は別の接続を作成しますが、今回はサーバー F によって処理されます。

これは、私にとって物事が少し曖昧になるところです。

  • Joe が戻ってきたときのセッション ID はわかっていますが (セッションはすべてのサーバーで共有されている可能性があります)、JMS サブスクリプションはどうでしょうか。サーバー F が再び Joe をトピックにサブスクライブする必要がある場合、Joe はメッセージを見逃しただけでしょうか? A は Joe がそのメッセージを取得できる唯一のサーバーですか、それとも、彼が F でサブスクライブし、メッセージを受信して​​いない (おそらく A で彼を待っている) ことを知っているときに発生する可能性のある何らかの魔法がありますか?

「サブスクライブ」が何をするのか (プロセスに関して)、それがクラスター化されたサーバーとどのように関連するのかについて、私は少し不明確だと思います。トピックメッセージの受信に関してクライアントの応答性を高めるために、ロングポーリング (cometd) と websockets を使用していますが、接続とサブスクリプションを処理できるサーバーが多数ある場合に、これがどのように機能するかを検討する必要があります。サーバーのピン留めを避けたい。

ご指摘ありがとうございます。

EDIT1:うまくいけば、いくつかの明確化。ここで私が言及しているのは、BlazeDS フレームワークで利用できる特定のものです。HTTP クライアントが JMS トピックにサブスクライブできるようにし、ロング ポーリングを使用してほぼリアルタイムのクライアント更新を実現しますが、クライアントがサーバーに到達すると、すべての要求がその 1 つのサーバーに戻される必要があります。そのため、(どういうわけか?) そのサーバー上のそのクライアントのトピック サブスクリプションをアクティブにしておく必要があります。私はその要件を取り除きたいです(あらゆるテクノロジー/フレームワークで)。

4

2 に答える 2

4

JMS サーバーは作成されたすべてのサブスクリプションを追跡し、Durable サブスクリプションと Non-Durable サブスクリプションを区別します。クライアント A、B、C とトピック T があるとします。

  1. クライアント A はトピック T にサブスクライブし、メッセージを待ちます
  2. クライアント B はトピック T にサブスクライブし、メッセージを待機します
  3. クライアント C は、トピック T に永続サブスクリプションを適用し、メッセージを待機します
  4. メッセージ M がトピック T に送られる数秒前にクライアント B と C がクラッシュする
  5. クライアント A はメッセージ M のコピーを取得します。これは、メッセージ M がサブスクライブされてお​​り、現在 jms サーバーに接続されているためです。
  6. クライアント B は再起動しますが、メッセージがトピックに到着したときに jms サーバーに接続されていなかったため、メッセージのコピーを取得しません。
  7. クライアント C は再起動してメッセージ M を取得します。これは永続的なサブスクリプションを渡すためです。C がクラッシュし、C が戻ってきてメッセージを要求するのを待っている間、JMS サーバーはメッセージ M のコピーを保持していました。

メッセージ サーバーには、メッセージをデッド レター キューに送信する前に永続サブスクライバーが戻ってきてメッセージを要求するのを jms サーバーが待機する時間の長さ、またはトピックのメッセージの最大数を制御するための管理設定があります。サブスクライバーが戻ってきて請求するのを待っています。決して失わないメッセージと、フロー メッセージおよびメモリ不足またはディスク容量の不足とのバランスを取る必要があります。

永続キューの概念は、永続サブスクライバーの概念とは異なることに注意してください。永続的なキューとトピックは、メッセージの受信を確認する前にキューとメッセージの内容をディスクに書き込むことで、JMS サーバーのクラッシュからユーザーを保護します。永続サブスクライバーは、クライアントが接続されていないときにメッセージが到着したときにメッセージに何が起こるかについてです。


古い答え。

JMS サーバーは、SQL データベースと同じように考えてください。Web コンテナーの観点からは、JMS サーバーへの接続のプールがあるはずです。そのため、JMS サーバーへの接続を取得して、トピックにサブスクライブする必要があります。例えば。

  • JMS サーバーには、AddressChangeTopic という 1 つのトピックがあります。
  • 各 tomcat インスタンスには AddressChangeTopic へのサブスクリプションがあります
  • Joe / Jim / John ... などのアドレス変更イベントはすべて、JohnAddressTopic、JimAddressTopic などではなく、同じ AddressChangeTopic に送られます。アプリケーションのユーザーごとに別のトピックを作成するのは現実的ではありません。 100 万人のユーザーが 100 万のトピックを持つことになりますか?

したがって、1 つのトピックが使用されている場合は、選択的コンシューマーを使用してそのトピックからのメッセージを消費する必要があります。http: //www.eaipatterns.com/MessageSelector.html を参照してください基準。たとえば、JMS メッセージをトピックにパブリッシュしたメッセージ プロデューサーは、ヘッダーまたは targetUser などと呼ばれる JMS プロパティを含める必要があります。その後、コンシューマーは、カスタム プロパティ targetUser="Joe" である AddressChangeTopic からのメッセージを提供すると言うことができます。いくつかの例のセレクターの例を参照してください ここ

これの鍵は、キューまたはトピックを、データベース テーブルをクエリできる方法でクエリできることを理解することですが、クエリ構文はかなり制限されています。概念的な観点から、Enterprise Integration Patterns Book http://www.amazon.ca/Enterprise-Integration-Patterns-Designing-Deploying/dp/0321200683を強くお勧めします

于 2013-01-08T05:08:35.550 に答える
0

Virtual Topicsはまさに私が探し求めていたソリューションです。問題と解決策を説明しています (私が持っているより簡潔な言葉で:-) 「JMS 永続トピックの制限」を参照してください。

于 2013-01-10T03:53:25.843 に答える