1

8 ノード クラスタ全体でシーケンス/カウンタを複製する必要があります。これは、各 http 要求が getNextIntAndIncrement() などを呼び出してシーケンス内の次の値を受け取ることを意味します。この場合、シーケンスの状態はすべてのサーバー間で同期されます。明確にするために、これはセッションではなく、アプリケーション/グローバル スコープで存在する必要があります。それはひどいアイデアのように聞こえ、間違いなくボトルネックにつながることはわかっていますが、これは要件です。

私の質問は、最良の解決策は何ですか? ステートフル セッション Bean を見てきましたが、それらは 1 つのクライアントだけのために設計されているようです。データベースのシーケンスを考えました。Terracotta クラスタリングについても調べました。シーケンスのデモがあります http://www.terracotta.org/web/display/orgsite/Recipe?recipe=sequencer ただし、J2EE ソリューションが存在する場合、サードパーティのソリューションは避けたいと思います。Weblogic 8.1 を使用しています。

4

3 に答える 3

2

一部の Java EE ベンダーは分散型キャッシュ ソリューション (WebSphere の Object Grid など) を提供しており、サード パーティの製品は既に特定されていますが、移植可能な標準が存在するとは思いません。

DB ソリューションの何が問題になっていますか? ロックが必要になることは明らかなので、DB に任せてみませんか。私の推測では、真の増分値が本当に必要な場合、欠落した値がない場合などは、他のデータベース値とのトランザクション関係が重要になるため、DB を使用してください。

絶対シーケンシャル値の必要性を緩和できる (つまり、ギャップを許容する) ことができれば、一連の数値を分割して、競合を大幅に減らすことができます。シーケンシャルな値が本当に必要で、ギャップがない場合は、インスタンス間のある程度のロックの必要性を受け入れています.2番目の「スレッド」が新しいシーケンス番号を取得することはできません現在のもの。奇数のシーケンス番号を失う余裕がある場合は、はるかに優れています。または、インスタンス間で番号付けスキームを独立させることができれば、はるかに優れた立場にいます。たとえば、サーバーa、b、cに名前を付けます... IDはa001、a002、b001、c001、c002などです。

于 2009-07-31T20:44:22.943 に答える
1

この質問のタグにweblogicがあります-Weblogicはクラスタシングルトンを許可します。たとえば、フェイルオーバーをサポートするクラスターごとに1つのインスタンス。

これはあなたの要件を満たすはずです:

http://e-docs.bea.com/wls/docs100/javadocs/weblogic/cluster/singleton/SingletonService.html

于 2009-07-31T22:23:08.297 に答える
1

特に高度にシリアル化されたトランザクションを使用して要求する場合は、データベース シーケンスが最も決定論的な結果をもたらす可能性が高いと思います。

ただし、このようなことを行うことの妥当性について真剣に疑問を呈しますが、それは私の 2 セントに過ぎません。

于 2009-07-31T20:41:16.133 に答える