2009-07-28 20 views
42

シングルトンオブジェクトをクラスタ環境にリファクタリングする最良の方法は何ですか?クラスタ環境のシングルトン

シングルトンを使用して、データベースからカスタム情報をキャッシュします。そのはほとんどがですが、特定のイベントが発生したときに更新されます。

ここでは、アプリケーションをクラスタ環境に展開する必要があります。定義によって、各JVMは独自のSingletonインスタンスを持ちます。したがって、リフレッシュ・イベントが単一のノードで発生し、そのキャッシュがリフレッシュされるときに、キャッシュがJVMの間で同期していない可能性があります。

キャッシュを同期させるにはどのような方法が最適ですか?

ありがとうございました。

編集:キャッシュは、主に自動補完リスト(パフォーマンス上の理由)をUIに提供するために使用され、Websphereを使用します。だからWebsphere関連のヒントは大歓迎です。

答えて

9

最も簡単な方法は、次のとおりです。しょっちゅうキャッシュをパージし、subsquentます呼び出しがソースから更新されたデータをフェッチするよう

  1. があなたのシングルトンのキャッシュに有効期限のタイマーを追加します(たとえば、

  2. JMSトピック/ tibRVなどを使用してキャッシュの通知メカニズムを実装します。各キャッシュインスタンスを取得し、このトピックでブロードキャストされたすべての変更メッセージに応答します。

+0

2について詳しく説明できますか?あなたはJMS pub/subscribeモデルを意味しますか? – lud0h

+0

はいソリューション2は基本的に、個々のキャッシュインスタンスの変更をブロードキャストするためにpub/subメカニズムを使用する方法です。それぞれのキャッシュによってサブスクライブされているアプリケーションサーバー上で実行されているJMSトピックを作成する必要があります。そのデータが変更されると、トピックにメッセージを公開する必要があります。各加入者はこのメッセージを受信し、それに応じてローカルキャッシュを更新する。 – pjp

+0

あなたのデータが非常に頻繁に変更されない場合、私はオプション1に行きます。私は、このアプローチを使用して参照データを更新するいくつかのシステムで作業しました。 30分おきにキャッシュをリフレッシュしていたと思います。選択した更新間隔は、参照データの使用方法に基づいて決まります。 – pjp

16

シングルトンキャッシュを分散キャッシュに置き換えます。

このようなキャッシュの1つはJBoss Infinispanである可能性がありますが、この時点でおそらくより成熟している商用のものを含め、他の分散キャッシュとグリッド技術が存在することは確信しています。

一般にシングルトンオブジェクトの場合、わかりません。私は最初にシングルトンを持っていないようにしようと思っています。

+0

私は、実装する最も簡単な(主観的に)ものが「ehcache」と思われることを発見しました。 –

1

可能であれば、可能であれば、アプリサーバーのサポートを使用してください(ある場合もあればそうでない場合もあります)。たとえば、JBossのサポートでは、クラスタマスターノード上でのみ実行されるサービスである「HA Singleton」を使用します。それは完璧ではありません(時には脳のおならを扱う場合があります)が、十分です。

JGroupsを使用してクラスタノードの自動検出とネゴシエーションを提供することができますが、それは簡単ではありません。

最後の手段として、データベースロックを使用してクラスタシングルトンを管理できますが、それは真剣にです。お勧めしません。

クラスタシングルトンの代わりに、分散キャッシュを使用することもできます。 JBossCache(JBossアプリケーションサーバーを実行する必要はありません)またはEhCache(配布メカニズムを提供しています)をお勧めします。分散して動作するようにキャッシュをリエンジニアリングする必要があります(魔法のように動作するわけではありません)が、クラスタシングルトンよりも優れたソリューションになるでしょう。

1

私はこの1つでVest Hansenと付き合っています。できるだけシングルトンから遠くに移動してください。 SAAJとJAXPの悪夢に悩まされ、互換性のあるバージョンがJBossで動作するようになった後、私はシングルトンや工場でやっています。 SOAPメッセージは、インスタンス化するためのファクトリを必要とすべきではありません。

大丈夫ですか、それともmemcacheなのでしょうか?あなたのキャッシュにはどんな親和性が必要ですか?これまでの時代遅れだったのは悪いのですか、それともデータの入手方法に柔軟性がありますか?

+0

オートコンプリートリストに使用するので、ユーザーは変更を見ることができません。あなたのフィードバックのためのThx。 – lud0h

4

それとも

memcachedの

http://www.danga.com/memcached/

のようなものは何をmemcachedのですか? memcachedは、 高性能、分散メモリ オブジェクトキャッシュシステムで、 の性質を持ちますが、データベースの負荷を軽減することによって の高速化を目指します。

Danga対話が LiveJournal.comの速度、 はすでに とWebサーバの束と データベースの束を2000万+ダイナミックページ1万人のユーザーのための一日あたりの 景色をしていたサイトを強化するために をmemcachedを開発サーバー。 memcachedは データベースの負荷がほとんどなくなり、 ユーザーのページ読み込み時間が速くなり、リソースの利用率が向上し、 となり、データベースへのアクセスが速くなりました。 memcache miss。

1

1)データのデータがどのくらいあるか、2)すべてのインスタンスが常に同じ値を持つ必要があるかどうかによって、これを処理する方法はいくつかあります。

データに合ったデータが必要だが、すべてのJVMに一致するデータがある必要がない場合は、すべてのjvmで同じスケジュール(たとえば30秒ごと)でデータを更新することができます。

リフレッシュがほぼ同時に発生する必要がある場合は、1つのJVMがすべてのJVMが常に同じ情報を必要とする場合

を「今すぐ更新するためにその時間を」と言って、それらの残りの部分にメッセージを送ることができますマスターは「今すぐリフレッシュする」と言っているシンクロを行う必要があります。すべてのキャッシュが新しいクエリーをブロックし、リフレッシュし、マスターに完了したことを伝えます。マスターがクラスタのすべてのメンバーから応答を返すと、処理を進めるという別のメッセージが送信されます。

+0

すべてのインスタンスにはいくつかのデータが必要です。そうしないと、ユーザーに新しい変更が表示されません。 JVMの同期を維持することについてもう少し詳しく説明できますか?どのようなサブ/通知を利用できますか?どうも。 – lud0h

+1

^すべてのインスタンスにはデータが必要です^ - >すべてのインスタンスには同じ*データが必要です – lud0h

+0

1、他のJVMに更新する方法を説明してください。あなたはパブ/サブアプローチを使用していますか? 2、遅れなく更新されたデータが必要な場合はどうすればいいですか?すなわち、JVM1内の1つのスレッドがデータを更新しており、次の分JVM2がそのデータを必要とする場合。この状況をどのように処理するか。 –

0

この状況で役立つメモリキャッシュ(memcacheなど)を持つ製品があります。

可能であれば、シングルトンを単一のものにするのではなく、アプリケーションが別々のインスタンスを持つことを許容するようにすることもできます(すべてリフレッシュする必要があるときはすべて認識します)。キャッシュをボトルネックにするJVM間での同期

+0

ええ、トリックの部分は、「リフレッシュする必要があるときにすべてを認識します」... JMSにはメッセージングプロバイダが必要です.RMIが唯一のオプションかもしれません。他のアイデア? (jGroups/Terracota以外)など...外部依存関係はありませんか? – lud0h

8

WASに組み込まれているDistributedMapを使用できます。

-Rick

+0

リンクありがとうございます。 JMSよりもセットアップと使用がはるかに簡単なようです。 – lud0h

+0

リンクは現在死んでいるようです... –

1

私は似たような状況に直面していますが、私は、OracleののWebLogicコヒーレンスを使用しています。

私は(テキストがWebフォームのラベルに表示する)データベースから読み込まキャッシュされたデータとハッシュマップを使用するWebアプリケーション上で働いています。これを達成するために、開発者はこのすべての情報を格納したシングルトンインスタンスを使用しました。これは単一のサーバー環境ではうまくいきましたが、今はクラスタソリューションに入りたいと思っています。この問題に直面しています。

私が今までに読んだことから、this is the best solution to accomplish what I want。これがあなたの問題に役立つことを願っています。

+0

上記のリンクは動作しません。このコンセプトを共有していただけますか? –

関連する問題