2016-12-29 5 views
1

私たちは、マルチクラスタ環境でprodにデプロイされたアプリケーションを、ロードバランサとともに使用しています。Jms Publishサブスクライバモデルに関するアドバイス

アプリケーションでは、パフォーマンスを向上させるためにキャッシュを保持します。

問題は、マルチクラスタ環境では、シングルトンは実際にシングルトンではないため、あるノードでキャッシュをクリアすると、他のノードには自分のキャッシュをクリーンアップするよう通知されません。

現在のところ、ノードは2つしかありませんが、今後は追加することができます。だから私の最初の考えは、モデルpublish/subscriberでJMSキューを実装することでした。ノードがキャッシュをクリアする必要があると、キューにメッセージを送信し、すべてのノード(自分自身)にキャッシュをクリアするように自動的に通知する必要があります。私はactivemqでチェックしましたが、私が見た限りでは、パブリッシャがメッセージを送信すると、サブスクライバはメッセージを受け取るためにgetMessage()を行う必要があります。それは、そこにメッセージがあるかどうかを確認するために待ち行列を引き続きすべきであることを意味し、すべての加入者がメッセージを読んだ後にメッセージが削除されるようにする必要があります。

activemqやその他のjms実装が私たちのニーズに合ったものを提供すれば、そのようなことを実装する方法についていくつかのアドバイスを得るために書いています。

ありがとう

答えて

1

このシナリオは、ActiveMQを含むすべてのJMSプロバイダで非常に簡単です。

トピックにメッセージを公開するだけです(例:CLEAR.CACHE)。次に、各ノードをそのノードに固有のクライアントID(再起動後も同じIDなので、コードではなく環境/設定からそのIDを取得する必要があります)に接続させます。

各ノードは、CLEAR.CACHEトピックの永続サブスクライバを作成できます。発行中にノードがオフラインであっても、コピーは各ノードに配信されます。

いくつかの公式ドキュメント:https://docs.oracle.com/cd/E19798-01/821-1841/bncgd/index.html

はちょうどあなたが手動でこのようなものに対処する必要はありません場合は、同様に使用するための完全な分散キャッシュソリューションがあることを言いたかったです。 Redis、hazlecastなどです。しかし、ノード間での基本的な「クリアキャッシュ」コマンド(またはノード間で分散する他のタイプのコマンド)が必要な場合は、JMSを使用してください。

+0

よろしくお願い致します。 – fgonzalez

関連する問題