在讲顺序一致性之前,咱们思考一个问题,假如说zookeeper是一个最终一致性模型,那么他会发生什么情况

ClientA/B/C假设只串行执行, clientA更新zookeeper上的一个值x。ClientB和clientC分别读取集群的不同副本,返回的x的值是不一样的。clientC的读取操作是发生在clientB之后,但是却读到了过期的值。很明显,这是一种弱一致模型。如果用它来实现锁机制是有问题的。

顺序一致性提供了更强的一致性保证,我们来观察下面这个图,从时间轴来看,B0发生在A0之前,读取的值是0,B2发生在A0之后,读取到的x的值为1.而读操作B1/C0/C1和写操作A0在时间轴上有重叠,因此他们可能读到旧的值为0,也可能读到新的值1. 但是在强顺序一致性模型,
如果B1得到的x的值为1,那么C1看到的值也一定是1.

需要注意的是:由于网络的延迟以及系统本身执行请求的不确定性,会导致请求发起的早的客户端不一定会在服务端执行得早。最终以服务端执行的结果为准。

简单来说:顺序一致性是针对单个操作,单个数据对象。属于CAP中C这个范畴。一个数据被更新后,能够立马被后续的读操作读到。

但是zookeeper的顺序一致性实现是缩水版的,在下面这个网页中,可以看到官网对于一致性这块做了解释 http://zookeeper.apache.org/doc/r3.5.5/zookeeperProgrammers.html#ch_zkGuarantees zookeeper不保证在每个实例中,两个不同的客户端具有相同的zookeeper数据视图,由于网络延迟等因素,一个客户端可能会在另外一个客户端收到更改通知之前执行更新,考虑到2个客户端A和B的场景,如果A把znode /a的值从0设置为1,然后告诉客户端B读取 /a, 则客户端B可能会读取到旧的值0,具体取决于他连接到那个服务器,如果客户端A和B要读取必须要读取到相同的值,那么client B在读取操作之前执行sync方法。

除此之外,zookeeper基于zxid以及阻塞队列的方式来实现请求的顺序一致性。如果一个client连接到一个最新的follower上,那么它read读取到了最新的数据,然后client由于网络原因重新连接到zookeeper节点,而这个时候连接到一个还没有完成数据同步的follower节点,那么这一次读到的数据不久是旧的数据吗?实际上zookeeper处理了这种情况,client会记录自己已经读取到的最大的zxid,如果client重连到server发现client的zxid比自己大。连接会失败

什么是顺序一致性呢?相关推荐

  1. Java之内存模型的基础、重排序、顺序一致性、volatile、锁、final

    为什么80%的码农都做不了架构师?>>>    深入理解Java内存模型(一)--基础 深入理解Java内存模型(二)--重排序 深入理解Java内存模型(三)--顺序一致性 深入理 ...

  2. 聊一聊ZooKeeper的顺序一致性

    来自:架构之美 ZooKeeper作为分布式应用系统协调服务,在分布式系统中的应用非常广泛,在某些业务场景下甚至可以作为注册中心.分布式锁来使用.ZooKeeper之所以能有如此广泛的应用,与它良好的 ...

  3. Java内存模型深度解析:顺序一致性--转

    原文地址:http://www.codeceo.com/article/java-memory-3.html 数据竞争与顺序一致性保证 当程序未正确同步时,就会存在数据竞争.java内存模型规范对数据 ...

  4. Java内存模型深度解析:顺序一致性

    码农网:http://www.codeceo.com/article/java-memory-3.html 数据竞争与顺序一致性保证 当程序未正确同步时,就会存在数据竞争.java内存模型规范对数据竞 ...

  5. Boost:顺序一致性的测试程序

    Boost:顺序一致性的测试程序 实现功能 C++实现代码 实现功能 顺序一致性的测试程序 C++实现代码 #include <boost/atomic.hpp> #include < ...

  6. 为什么程序员需要关心顺序一致性,而不是 Cache 一致性?

    本文所讨论的计算机模型是Shared Memory Multiprocessor,即我们现在常见的共享内存的多核CPU.本文适合的对象是想用C 或者Java进行多线程编程的程序员.本文主要包括对Seq ...

  7. 顺序一致性内存模型与JMM的“顺序一致性”

    顺序一致性内存模型是一个被计算机科学家理想化了的理论参考模型,它为程序员提供了极强的内存可见性保证.顺序一致性内存模型有两大特性. 1)一个线程中的所有操作必须按照程序的顺序来执行. 2)(不管程序是 ...

  8. 深入理解JMM(Java内存模型) --(三)顺序一致性

    数据竞争与顺序一致性保证 当程序未正确同步时,就会存在数据竞争.Java内存模型规范对数据竞争的定义如下: 在一个线程中写一个变量, 在另一个线程读同一个变量, 而且写和读没有通过同步来排序. 当代码 ...

  9. 强一致性、弱一致性、顺序一致性、最终一致性概述

    通俗易懂 强一致性.弱一致性.最终一致性.读写一致性.单调读.因果一致性 的区别与联系 什么是一致性 一致性的种类 导致一致性出现的原因 强一致性 与 弱一致性 强一致性两个要求 弱一致性 强一致性和 ...

最新文章

  1. 云计算与边缘计算协同发展的一些思考
  2. android 和 iphone x,在快充方面,iPhone X和iPhone 8系列都落后于Android 旗舰
  3. Redhat7 samba配置(部分)
  4. TCP三次握手建立连接的过程
  5. Advice for Students--开始学术研究
  6. 这些令人仰望的C++大咖,都是怎样炼成的?
  7. apache ab压力测试报错apr_socket_recv
  8. 软件测试技术lab1 2017.3.13
  9. 天融信安全接入客户端_天融信提示您警惕物联网设备Ripple20漏洞风险
  10. 61 SD配置-科目分配-分配税收确定的交货工厂
  11. 解决WP表前缀更换后出现的You do not have sufficient permission
  12. Pandas快速上手(一):基本操作
  13. php 截图插件,react中有实现截图插件吗
  14. DBA整理的万字详解MySQL性能优化,值得收藏!
  15. C++实现复制文本粘贴文本功能
  16. 如何卸载红蜘蛛多媒体网络教室软件
  17. 18位华人当选2022年加拿大工程院院士!京东副总裁梅涛入选!
  18. html制作凤凰网,有哪些不用编写代码就能轻松制作生成HTML5页面的工具
  19. pytorch之transforms
  20. 【BLENDER】-渲染 背景设置

热门文章

  1. 用js控制选择CheckBoxList
  2. tensorflow-RNN和LSTM
  3. 老板和主管不懂SEO,乱给SEO人员下指令怎么办?
  4. pmd代码安全扫描工具
  5. HDU1251 统计难题 【trie树】
  6. 一条代码解决各种IE浏览器兼容性问题
  7. 数据库主键设计之思考(转)
  8. 关于编译器的一个疑问
  9. io-同步 异步 阻塞 非阻塞
  10. 【转摘留用】页面静态化..