我对Apache Ignite很陌生,所以请保持温和。我的问题很简单。 如果我使用Apache Ignite有一个复制的缓存。我写入此缓存键123.我的群集有10个节点。
第一个问题是:
复制缓存是否意味着在" put"之前调用回来键123必须写入所有10个节点?或者呼叫是否立即返回,复制是在幕后完成的?
第二个问题是: 假设密钥123写在节点1上。它现在被复制到所有其他节点。然而,几微秒后,节点2尝试使用不同的值写入密钥123。我现在有竞争条件吗?或者,Ignite以某种方式处理这种情况,其中节点2尝试写入密钥123不会发生,直到节点1"放置"已跨所有节点复制?
对于某些情况,我尝试构建的是跨机器群集的重复数据删除系统。我希望我能够创建我的API请求的哈希值(只有使请求唯一的值)并将其写入Ignite Cache。只有在缓存尚未包含唯一哈希(可能由其他API实例创建)时,API请求才会继续。当然,缓存会有一个驱逐策略,可以在几秒钟之后驱逐这些缓存密钥,因为它们不再需要了。
答案 0 :(得分:1)
REPLICATED
缓存与PARTITIONED
相同,具有无限数量的备份和一些优化。因此它具有根据affinity function分布在节点上的主分区。
现在,当您执行更新时,请求将进入主节点,而主节点则会更新所有备份。属性CacheConfiguration.setWriteSynchronizationMode()负责更新条目的方式。默认情况下它是PRIMARY_SYNC
,这意味着调用put()
的线程将只等待主分区更新,并且备份将异步更新。如果将其设置为FULL_SYNC
,则仅在更新所有备份时才会释放线程。
回答第二个问题,没有竞争条件,因为所有请求都会到达主节点。
除了您的澄清之外,如果备份节点尚未更新,get()
请求将转到主节点,因此在PRIMARY_SYNC
模式下,如果主分区,您将永远不会为null有价值。