web-dev-qa-db-ja.com

クラスター環境のシングルトン

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

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

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

キャッシュの同期を保つための最良の方法は何ですか?

ありがとう。

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

43
lud0h

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

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

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

9
pjp

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

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

シングルトンオブジェクト全般については、よくわかりません。そもそもシングルトンを持たないようにしようと思います。

16
Chris Vest

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

-リック

8
Rick

またはmemcachedのようなもの

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

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

Danga Interactiveはmemcachedを開発して、LiveJournal.comの速度を向上させました。このサイトは、多数のウェブサーバーと多数のデータベースサーバーを備え、100万人のユーザーに対して1日に2000万回以上の動的ページビューを行っていました。 memcachedはデータベースの負荷をほとんどゼロにして、ユーザーのページの読み込み時間を短縮し、リソースの使用率を向上させ、memcacheミス時のデータベースへのアクセスを高速化しました。

4
monkey_p

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

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

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

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

1
KeithB

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

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

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

1
XpiritO

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

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

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

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

1
skaffman

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

いいでしょう、大げさですが、memcacheなどはどうですか?キャッシュにはどのような類縁性が必要ですか?古くなっているのは悪いことですか、それともデータが古くなる可能性に柔軟性がありますか?

1
Chris K

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

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

0
Yishai