2017-06-01 2 views
1

キャッシングのためにHazelcast(JCache標準)を使用して分散アプリケーションを作成しています。ヘイルキャストクラスタの鍵をロックする

私は、更新中の呼び出しを防ぐために、クラスタ内の特定のキーにロックを設定する必要があります。

  1. スレッド1:設定変更のためのITEM1を取得
  2. スレッド2(ロックを置く):更新のためITEM1を取得します。
  3. thread2:アイテム1を更新し、新しいタイムスタンプを入れます。
  4. スレッド1:私はEhcacheのは非常に似た何かを持っている知っている古い値とタイムスタンプ

でITEM1を入れて、それがacquireReadLockOnKey(オブジェクトキー)と呼ばれています。

JCacheおよび/またはHazelcastを使用して、この種のロックをどのように達成できますか?

答えて

2

Entry Processorを参照してください。これは、アトミックおよびロックフリーの方法でキャッシュエントリの更新操作を実行します。

+0

JCacheのEntryProcessorについて話していますか?分散キャッシュで正常に動作しますか? – Forin

+2

私たちのプロジェクトでは、Hazelcast IMapにEntry Processorを使用しています。同時実行の問題に直面していません.Entry Processorは、分散環境でデータを変更する良い方法です。エントリプロセッサはキー所有者に対して実行されるため、アトミック性を実現して を実現し、ネットワーク経由でデータを送信しないようにします。 –

+0

両方の答えにはメリットがあります。競合が少ない場合は、上記のようにCASに行くことができます。それ以外の場合、JCacheの 'EntryProcessor'、[契約](https://github.com/jsr107/jsr107spec/blob/37937a43c66b986dbfc0aa8291c8f10975b26dc0/src/main/java/javax/cache/processor/EntryProcessor.java#L26-L32)を使用することができます。キーに対して原子的に実行されることを保証します。 'EntryProcessor'コードがHazelcastクラスターのすべてのメンバーに配備されていることを確認するだけです。 –

3

CAS(Compare And Set)のような操作(ConcurrentMap :: replaceなど)を使用し、実際のロックではない楽観的なロックパターンを使用することをお勧めします。

while(true) { 
    // Get the old value 
    T oldValue = map.get(key); 
    // Create the new value based on the "known old state" 
    T newValue = createNewValue(oldValue); 
    // Try to atomically exchange to the new value, if oldValue is still valid 
    if (map.replace(key, oldValue, newValue) break; 
    // If oldValue isn't valid anymore, retry 
} 

高い競合率がないほとんどの状況では、これは実際のロックよりも優れた代替です。これは、リード・モディファイ・ライト問題の大部分を解決し、EntryProcessorクラスをデプロイする/クラスタ上で使用する必要はありません。

関連する問題