2011-09-19 4 views
3

分散キャッシュ製品とは、CoherenceやHazelcastのようなものです。私は例としてHazelcastを使用します。それは複数のマップを変更するためアソシエイト()関数は、トランザクションにする必要があることを分散キャッシュ製品内で複数の分散マップ上で動作するトランザクションを伝える方法

class DataState { 
    Map<ID, Dog> dogs = Hazelcast.getMap("dog"); 
    Map<ID, Owner> owners = Hazelcast.getMap("owner"); 

    public void associate(Dog dog, Owner owner) { 
      /* ... put in maps and set up references */ 
    } 
} 

注:

は、私はマップの数の状態を維持したオブジェクトがあるとします。犬と所有者は何らかの形で関連付けられているため、メソッドが完了するまでデータが矛盾した状態になっている可能性があります。他のクラスが分散メモリから読み込んだ場合、トランザクションが起こっていて、データが一貫していないとは考えられません。

class DataStateClient { 
    Map<ID, Dog> dogs = Hazelcast.getMap("dog"); 
    Map<ID, Owner> owners = Hazelcast.getMap("owner"); 

    public void doSomething() { 
     // oops, owner2 is associated with dog1 but 
     // dog1 is not yet in the map! 
    } 
} 

は今、Hazelcastはこのような何かを解決するためにロックを配布していますが、パフォーマンスへの影響は何ですか? doSomething()が高価である(たとえば、両方のマップをローカルにコピーする)場合、複数のクライアントをロックアウトするのに十分でない場合があるとします。

この分散同期の問題の標準的な解決法はありますか?

+1

はいロックが...悪いですので、取引を行います。注文することができますこの特定の問題を解決する。最初にドッグ1を地図に載せて、関連付けを作成しますか?したがって、関連付けられたdog1は常にマップ内にあります。 –

答えて

1

書き込みアクセス(相互排除)をシリアル化する場合は、分散ロックを使用します。 Cacheonixを使用していた場合、Cacheonixの読み込み/書き込みロックを使用した方がパフォーマンスが向上します。この方法で読者が同時読み取りアクセス権を持っている可能性があり、シンプルなミューテックスを使用した場合には、ケースとなり終了する単一のサーバーを待つ必要がないでしょう。

脚本:

final Cacheonix cacheonix = Cacheonix.getInstance(); 
    final ReadWriteLock rwLock = cacheonix.getCluster().getReadWriteLock(); 
    final Lock writeLock = rwLock.writeLock(); 
    writeLock.lock(); 
    try { 
    // No one else can enter this section 

    // Update dogs 

    // Update owners 
    } finally { 
    writeLock.unlock(); 
    } 

...

読者:

final Cacheonix cacheonix = Cacheonix.getInstance(); 
    final ReadWriteLock rwLock = cacheonix.getCluster().getReadWriteLock(); 
    final Lock readLock = rwLock.readLock(); 
    readLock.lock(); 
    try { 
    // Readers can enter this section simultaneously 

    // Read dogs 

    // Read owners 
    } finally { 
    readLock.unlock(); 
    } 
関連する問題