Chronicle Map原子性语义

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Chronicle Map原子性语义相关的知识,希望对你有一定的参考价值。

我想知道Chronicle Map中的Atomicity语义。如果我在两个节点(服务器)之间共享一个编年史地图,并且我尝试在两个节点上同时将相同的密钥插入到此映射中,那么事务语义是什么?

第一次放置会成功而第二次放弃会失败吗?

我很好奇,如果Chronicle Map保证与Apache Zookeeper相同的Transactional语义?

在我的用例中,我想依赖于这样的事实,即如果node1将一个键K1放入映射中,那么node2将能够检查K1的存在,如果它不在那里,它肯定会知道它是第一个到添加K1。

实际上,询问ChronicleMap上的放置是否是跨越2个节点的分布式事务。

非常感谢克利福德

答案

Chronicle Map使用最终的一致性,最后一个获胜。当您观察微秒时间尺度时,节点处于裂脑节点中,因为无法以此速度使它们保持同步。这是设计的,因为Map旨在支持每台服务器每秒数百万次更新。通常,确保两台服务器在正常操作下不会同时更新同一密钥并不困难。例如。您可以使用Engine将所有更新传递到一个服务器,也可以对密钥进行分区以进行更新。虽然分布式交易听起来像个好主意,但你应该注意到; - 它们慢了许多个数量级 - 很难从像脑裂的失败中恢复过来。 - 测试您的应用程序在不同的故障条件下正常工作是一个真正的痛苦

我认为最好设计一个不需要这个假设的系统,如果没有经过大量的测试,你就会知道它在失败时的表现。

假设您将zookeeper安装到三个数据中心并确保一个数据中心的故障不会停止操作,确保没有数据中心有一半或更多的节点(两个数据中心是不够的)但是说你有一个临时的裂脑造成的缓慢的互连,这会影响任何更新,但在瞬态中难以重现或测试。使用编年史地图,数据中心可以在任何时间内断开连接,并且所有保证都得到尊重,您无需进行其他测试。实际上,您可以丢失除一个节点之外的所有节点并仍然具有完整操作

以上是关于Chronicle Map原子性语义的主要内容,如果未能解决你的问题,请参考以下文章

二:并发编程之JMM&synchronized&volatile详解

Java并发 chapter3 共享对象

什么是程序的原子性

volatile原理

2. 原子性 Atomic

Redis如何保证原子性