2012-04-05 9 views
2

今日のビルドプラットフォームは、JPA、Guice、JSR 303 bean検証で非常に高速です。何かを鞭打ちするのはむしろ簡単です。Java EEアプリケーションサーバーなしでJavaクラスター内でシングルトンを実行する方法

Guiceを使用していて、JVMマシンのクラスタ内でシングルトンとしてポーラープロセスを使用していたとします。クラスタは(3機)の起動時にどのように私は簡単に実行中のシングルトンを持つマシンに障害が発生した場合のみ1が

  • シングルトンを起動し、他のマシンのいずれかが起動していること、それので

    1. 作ることができますシングルトン

    これは今日のライブラリーではあまり難しくありません。もっと見ると、私はjgroupsが答えだと思っていますが、他の人から聞いてみたいと思います(Jbossは私がこれまで見てきたことからjgroupsを使います)。

  • +1

    にあります。JPAはJava EEのサブセットであることはご存じでしょうか? –

    +0

    "JEE"の意味を混乱させるようです。これは "EJB"の同義語ではありません。それを除けば... JEE/EJBを使用したくない場合、この質問にタグを付けた唯一のタグは "java-ee"ですか? –

    +0

    はい、私はJPAがJava EEのサブセットであったことを知っていました。はい、私はそれを間違って発言しました。 –

    答えて

    1

    と分散ロックの場合は、Hazelcast and Singletonをご覧ください。

    おそらくでも同様のことができます。

    +2

    私はこれをEHCache(Terracottaによるオープンソースプロジェクト)でやってみました。ただし、アプリケーションの詳細を提供すると、より完全な回答が得られる場合があります。クラスタ化された環境でシングルトンが必要なときに10回のうち9回...本当に必要なのはJMSメッセージキューベースのアプローチです。 –

    0

    私はこれ以上調べていました。 JBossはjgroupsを使うように見えますが、それは十分に単純なようです。

    1

    アプリケーションで中央データベースを使用できる場合は、データベース表の行に対してペシミスティック・ロックを使用できます。特定のサーバー・ノード上のすべてのシングルトンは、特定の表の行で悲観的なロックを取得しようとします(Oracleでは「SELECT FOR UPDATE」によって取得されます)。シングルトンがロックを取得した場合、必要な処理はすべて実行できます。さもなければ、ロックを待つだけです。ワーキングシングルトンインスタンスがダウンすると、別の待機シングルトンがロックを取得して作業を開始します。 行レベルのロックがインスタンスの存続期間中保持されるようにするには、コミットまたはロールバックによってトランザクションを終了しないように注意する必要があります。

    また、作業シングルトンはタイムスタンプを定期的に保存でき、他の待機シングルトンはこのタイムスタンプが特定の時間間隔中に更新されることをチェックします。もう更新されない場合、別のシングルトンはそのタイムスタンプの「所有者」を取得し、自身を開始することができます。この方法では、ロックを保持するための専用のデータベース接続は必要ありませんが、別のクラスタ・メンバーへのテークオーバーは、タイムアウトが待たれているため遅くなります。

    - ロバート

    関連する問題