分散キャッシュ製品とは、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()が高価であると仮定します(たとえば、両方のマップをローカルにコピーする)。その場合、複数のクライアントをロックアウトするのは適切でない可能性があります。
この分散同期の問題に対する標準的な解決策はありますか?