gpt4 book ai didi

java - 如何在分布式缓存产品中传输在多个分布式 map 上运行的事务

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:15:28 24 4
gpt4 key购买 nike

我所说的分布式缓存产品是指像 Coherence 或 Hazelcast 这样的产品。我将使用 Hazelcast 作为示例。

假设我有一个在多个 map 中保持状态的对象:

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 */
}
}

请注意,associate() 函数需要是事务性的,因为它会修改多个映射。由于狗和主人以某种方式相关联,因此在方法完成之前数据可能处于不一致状态。现在如果另一个类从分布式内存中读取,它不知道正在发生事务并且可能会看到不一致的数据。

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() 开销很大(例如,在本地复制两个映射),在这种情况下可能不足以锁定多个客户端。

这个分布式同步问题是否有标准的解决方案?

最佳答案

如果你想序列化写访问(互斥),分布式锁是一种可行的方法。如果您正在使用 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();
}

关于java - 如何在分布式缓存产品中传输在多个分布式 map 上运行的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7477967/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com