分散キャッシュ製品とは、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を地図に載せて、関連付けを作成しますか?したがって、関連付けられたdog1は常にマップ内にあります。 –