首页 文章

Apache Ignite Replicated Cache竞争条件?

提问于
浏览
0

我对Apache Ignite很陌生,所以请保持温和 . 我的问题很简单 . 如果我有使用Apache Ignite的复制缓存 . 我写入此缓存键123.我的群集有10个节点 .

第一个问题是:

复制缓存是否意味着在“put”调用返回之前,密钥123必须写入所有10个节点?或者呼叫是否立即返回并且复制是在幕后完成的?

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

对于某些上下文,我正在尝试构建的是跨机器群集的重复数据删除系统 . 我希望我能够创建我的API请求的哈希值(只有使请求唯一的值)并将其写入Ignite Cache . 只有在缓存尚未包含唯一哈希(可能由其他API实例创建)时,API请求才会继续 . 当然,缓存将具有驱逐策略以在几秒钟之后驱逐这些缓存密钥,因为它们将不再需要 .

1 回答

  • 1

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

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

    回答第二个问题,不会出现竞争条件,因为所有请求都将来到主节点 .

    除了您的澄清之外,如果备份节点尚未更新, get() 请求将转到主节点,因此在 PRIMARY_SYNC 模式下,如果主分区具有值,则永远不会为null .

相关问题