59

どの分散ロックサービスを使用しますか?

要件は次のとおりです。

  1. 異なるプロセス/マシンから見られる相互排除(ロック)
  2. ロック...リリースセマンティクス
  3. 特定のタイムアウト後の自動ロック解放-ロックホルダーが死んだ場合、X秒後に自動的に解放されます
  4. Javaの実装
  5. ありがたい:.Netの実装
  6. 無料の場合:デッドロックの検出/軽減
  7. 簡単な展開。以下の注を参照してください。

「データベースを介して実行できる」や「JavaSpacesを介して実行できる」などの回答には興味がありません。すぐに使える、すぐに使える、実績のある実装に興味があります。

4

6 に答える 6

23

ブロックの新しい子供はhazelcastです。私はそれで遊んでいます、そしてそれは使用と設定が驚くほど簡単です。

私が見る限り、hazelcastには依存関係がないため、つまりjgroups.jarなどがないため、Gigaspacesとhazelcastの間に競合は発生しないはずです。

ヘーゼルキャスト

  1. 相互排除(ロック)、うんの実装java.util.concurrency.locks.Lock
  2. 特定のタイムアウト後の自動ロック解放。メンバーがクラスターを離れると、すべてのロックが解放されます。
  3. Javaの実装、うん
  4. ありがたい:.Net実装、nopeは純粋なJavaソリューションであり、j#に移植できる可能性があります
  5. 無料の場合:デッドロックの検出/軽減、いいえ、これを処理するために私のHazelcastは何の努力もしていません
  6. 簡単なデプロイ。アプリケーションの一部としてデプロイされた、単一の構成ファイルを含む単一のjarであり、追加のプロセスは必要ありません。
于 2009-06-30T08:29:34.340 に答える
14

ApacheのZookeeper(Hadoopサブプロジェクト)をチェックしてください-分散同期を提供します。ドキュメントは素晴らしいものではありませんが、そこにあるものは興味深い製品に見えます-Zookeeperの使用方法に関するアイデアのレシピをチェックしてください。

おそらく必要なレベルよりも低レベルであり、専用サーバーを推奨するため、追加の展開が必要です。

さまざまなロック戦略をモデル化することができ、ロックホルダーが死ぬ(エフェメラルノード)ためのソリューションを提供します。

于 2009-06-30T10:19:25.350 に答える
12

オープンソース版を含むT​​eracottasynchronizedは、またはのいずれかを使用してロックセマンティクスを分散していjava.util.concurrent.ReentrantReadWriteLockます。後者は明らかに要件に適合しています。


アップデート

質問にGigaSpacesとの「混合」の要件が追加されたので、それらを混合しないでください。これにより、技術スタックがさらに複雑になり、次のような作業が必要になります。

  • コードとインフラストラクチャの両方の観点から統合する。
  • それらの間の同期を管理します。
  • テラコッタの学習/チューニング/デバッグ。

GigaSpacesに基づくロックソリューションの作成または実装に費やす方がよいでしょう。

于 2009-06-29T18:02:41.430 に答える
8

インメモリデータグリッドに基づくRedisであるRedissonを使用することをお勧めします。分散オブジェクトやオブジェクトなど、使い慣れたJavaデータ構造を実装します。リースタイムを設定する機能を含みます。使用例:java.util.Lockjava.util.concurrent.ReentrantReadWriteLockLock

Redisson redisson = Redisson.create(config);

Lock lock = redisson.getLock("anyLock");
try {
   // unlock automatically after 10 seconds of hold
   lock.lock(10, TimeUnit.SECONDS);

} finally {
   lock.unlock();
}

...

redisson.shutdown();

AzureやAWSなどのクラウドベンダーをサポートします。

于 2014-01-12T06:48:13.570 に答える
2

ZooKeeperは、 Apache Curatorフレームワークの助けを借りて、分散ロックの事実上の標準になりました。詳細については、レシピのロックを確認してください。

于 2014-04-16T08:46:48.177 に答える
-2

非常に安定して成熟しているOracleCoherenceには、相互排除のサポートが含まれています。

  cache.lock(key, -1);
    try {
      // .. add your critical code here
    } finally {
      cache.unlock(key);
    }

ロックは、サーバーの障害、ローリングの再起動などに耐えます。

完全に開示するために、私はOracleで働いています。この投稿で表明された意見や見解は私自身のものであり、必ずしも私の雇用主の意見や見解を反映しているわけではありません。

于 2014-02-14T19:36:16.477 に答える