43

Singleton オブジェクトをクラスター環境にリファクタリングするための最良の戦略は何ですか?

シングルトンを使用して、データベースからいくつかのカスタム情報をキャッシュします。ほとんど読み取り専用ですが、特定のイベントが発生すると更新されます。

ここで、アプリケーションをクラスター環境にデプロイする必要があります。定義上、各 JVM には独自のシングルトン インスタンスがあります。そのため、1 つのノードで更新イベントが発生し、そのキャッシュが更新されると、JVM 間でキャッシュが非同期になる可能性があります。

キャッシュの同期を維持する最良の方法は何ですか?

ありがとう。

編集: キャッシュは主に UI にオートコンプリート リスト (パフォーマンス上の理由) を提供するために使用され、Websphere を使用します。したがって、Websphere 関連のヒントは大歓迎です。

4

9 に答える 9

16

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

そのようなキャッシュの1つにJBossInfinispanがありますが、この時点でおそらくより成熟している商用のものを含め、他の分散キャッシュおよびグリッドテクノロジーが存在すると確信しています。

一般的なシングルトンオブジェクトの場合、よくわかりません。そもそもシングルトンを持たないようにしたいと思います。

于 2009-07-28T13:35:51.673 に答える
10

最も簡単なアプローチは次のとおりです。

  1. シングルトン キャッシュに有効期限タイマーを追加して、頻繁にキャッシュがパージされ、後続の呼び出しがソース (データベースなど) から更新されたデータをフェッチするようにします。

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

于 2009-07-28T13:54:30.183 に答える
8

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

-リック

于 2009-08-04T21:57:38.927 に答える
4

またはmemcachedのようなもの

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

memcached とは何ですか? memcached は、高性能の分散メモリ オブジェクト キャッシング システムであり、本質的に汎用的ですが、データベースの負荷を軽減して動的な Web アプリケーションを高速化するために使用することを目的としています。

Danga Interactive は、LiveJournal.com の速度を向上させるために memcached を開発しました。LiveJournal.com は、多数の Web サーバーと多数のデータベース サーバーを備えた 100 万人のユーザーに対して、1 日あたり 2,000 万以上の動的ページ ビューを既に実行していました。memcached により、データベースの負荷がほとんどゼロになり、ユーザーのページの読み込み時間が短縮され、リソースの使用率が向上し、memcache ミス時のデータベースへのアクセスが高速化されました。

于 2009-07-28T13:55:42.630 に答える
1

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

それができない場合は、クラスターノードの自動検出とネゴシエーションを提供するJGroupsを使用して何かを設計できる可能性がありますが、それは簡単ではありません。

最後の手段として、データベースロックを使用してクラスターシングルトンを管理できますが、これは非常脆弱です。推奨されません。

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

于 2009-07-28T13:38:00.827 に答える
1

これについてはベスト・ハンセン氏と一緒です。できるだけシングルトンから離れてください。SAAJ と JAXP という悪夢に悩まされ、互換性のあるバージョンを JBoss で動作させるようになった後、私はシングルトンとファクトリを使い果たしました。SOAP メッセージは、それをインスタンス化するためのファクトリを必要としません。

オーケー、わめき散らす、memcache などはどうですか? キャッシュにはどのような種類のアフィニティが必要ですか? それが常に古くなっているのは悪いことですか、それともデータがどの程度古くなっているかについてある程度の柔軟性はありますか?

于 2009-07-28T13:41:43.413 に答える
1

私も同様の状況に直面していますが、Oracle のWebLogicCoherenceを使用しています。

データベースから読み取ったキャッシュ データ ( webformのラベルに表示するテキスト)を含むハッシュマップを使用する Web アプリケーションで作業しています。これを実現するために、開発者はこのすべての情報を格納するシングルトン インスタンスを使用しました。これは単一サーバー環境ではうまく機能しましたが、今度はクラスター ソリューションに進みたいと考えており、このシングルトン インスタンスでこの問題に直面しています。

私が今まで読んだことから、これは私が望むことを達成するための最良の解決策です. これがあなたの問題にも役立つことを願っています。

于 2010-02-25T11:16:00.993 に答える
1

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

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

更新をほぼ同時に行う必要がある場合は、1 つの jvm から残りの jvm に「今すぐ更新する時間です」というメッセージを送信できます。

すべての jvm が常に同じ情報を必要とする場合は、同期を行う必要があります。マスターが「今すぐ更新」と言うと、すべてのキャッシュが新しいクエリをブロックし、更新して、完了したことをマスターに伝えます。マスターは、クラスターのすべてのメンバーから応答を受け取ると、続行するように指示する別のメッセージを送信します。

于 2009-07-28T13:59:16.650 に答える
0

このような状況で役立つメモリ キャッシュ (memcache など) に分散された製品があります。

可能であれば、より良い解決策は、シングルトンを実際には単一にするのではなく、アプリケーションが個別のインスタンスを持つことを許容するようにすることです (更新が必要なときにすべてが認識されるとします)。ただし、JVM 間で同期する必要はありません。キャッシュがボトルネックになる可能性があります。

于 2009-07-28T13:59:43.763 に答える