Apache Ignite 复制缓存竞争条件?

Apache Ignite Replicated Cache race conditions?

我是 Apache Ignite 的新手,所以请多关照。我的问题很简单。 如果我有一个使用 Apache Ignite 的复制缓存。我写入此缓存键 123。我的集群有 10 个节点。

第一个问题是:

复制缓存是否意味着在 "put" 调用返回之前必须将密钥 123 写入所有 10 个节点?还是调用会立即返回并在幕后完成复制?

第二个问题是: 假设密钥 123 写在节点 1 上。它现在正在被复制到所有其他节点。然而,几微秒后,节点 2 尝试使用不同的值写入密钥 123。我现在有竞争条件吗?或者 Ignite 是否以某种方式处理这种情况,在节点 1 的 "put" 复制到所有节点之前,节点 2 不会尝试写入密钥 123?

在某些情况下,我要构建的是跨 API 机器集群的重复数据删除系统。我希望我能够为我的 API 请求创建一个散列(只有使请求唯一的值)并将其写入 Ignite 缓存。 API 请求仅在缓存尚未包含唯一哈希(可能由不同的 API 实例创建)时才会继续。当然,缓存会有一个逐出策略,在几秒钟后逐出这些缓存键,因为它们不再需要了。

REPLICATED 缓存与 PARTITIONED 相同,具有无限数量的备份和一些优化。因此它具有根据 affinity function 跨节点分布的主分区。

现在当您执行更新时,请求到达主节点,主节点依次更新所有备份。 属性 CacheConfiguration.setWriteSynchronizationMode() 负责更新条目的方式。默认情况下是 PRIMARY_SYNC,这意味着调用 put() 的线程将只等待主分区更新,而备份将异步更新。如果设置为FULL_SYNC,只有在所有备份更新后才会释放线程。

回答你的第二个问题,不会有竞争条件,因为所有请求都会到达主节点。

除了您的说明之外,如果备份节点尚未更新,get() 请求将转到主节点,因此在 PRIMARY_SYNC 模式下,如果主分区具有值。