2017-08-14 76 views
0

我对Apache Ignite很新,所以请温和。我的问题很简单。 如果我有使用Apache Ignite的复制缓存。我写这个缓存键123.我的集群有10个节点。Apache Ignite复制缓存竞争条件?

第一个问题是:

是否复制缓存意味着之前的“放”呼回来钥匙123必须写入所有10个节点?或者电话立即回来,复制是在幕后完成的?

第二个问题是: 假设键123写在节点1上。它现在被复制到所有其他节点。然而,几微秒后,节点2尝试写入具有不同值的密钥123。我现在有比赛条件吗?或者Ignite以某种方式处理这种情况,节点2尝试写入密钥123的尝试不会发生,直到节点1的“put”跨所有节点复制?

对于某些上下文,我试图构建的是跨API应用程序集群的重复数据删除系统。我希望能够创建我的API请求的散列(只有使请求唯一的值)并将其写入Ignite Cache。只有当缓存中尚未包含唯一散列(可能由不同的API实例创建)时,API请求才会继续。当然,高速缓存将有一个驱逐策略,在几秒钟后驱逐这些高速缓存密钥,因为它们不再需要。

回答

1

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

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

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

除了您的说明,如果备份节点还没有更新,get()请求将转到主节点,因此在PRIMARY_SYNC模式下,如果主分区具有值,则永不会变为空值。