12.7.16

ZK的一些简单的笔记(3.4.8)

前言

断断续续的对 zookeeper 浅尝即止。每次重新拿起来又要重新过一遍之前学过的东西,真是苦不堪言。希望这次能做一些笔记,帮助下一次重新拾起时快速重温吧。

ZK的语义特性

不知道应不应该说是“语义特性”,姑且这样记下来。
  • 类文件路径的数据模型
  • 监察器
  • 一致性保证
上面三样在这次重温时多少还有点印象。但下面这个就没有多少印象了。有可能前一次就没有认真看,或没有看懂:
  • ZK会话

一个简单的ZK编程模型

ZK提供了四种recipes。但如果从最基本的语义,或分布式操作原语的角度来看,ZK有一个最基本的编程模型:异步消息驱动的树型结构的数据库。

理论上说ZK可以用轮询的方式进行编程,但显然,在一个有实际意义的系统中,单纯的论询是很有限制的。整个ZK编程模型,基本上是建立在异步消息驱动上。

监控的位置(三个读操作)

ZooKeeper Programmer's Guide文档的ZooKeeper Watches一节中开宗明义地指出了三种(也就是所有的)读操作,都可以设定监控,或事件驱动接口。
  • getData()
  • getChildren()
  • exists()
我觉得更合适的说法应该是注册事件驱动器。具体的信息可以查看相关的API文档:ZooKeeper (ZooKeeper 3.4.6 API)

读操作以外:连接监控

我觉得还需要记得的一点是连接监控器。如果一直活跃地进行ZK的开发,当然知道这个,但象我断断续续地做这个,就很容易忘了。为了实现一个简单的zk连接测试,我以前还做过这个笔记。


定义中的三个重要组成部分

在程序员指南中重点指出了ZK监控的三个重要语义:
  • 单触发(One-time trigger)
  • 撩客户(Sent to the client)
  • 仅数据(The data for which the watch was set)
这个是基于ZK监控定义提炼出来的语义特点:A watch event is one-time trigger, sent to the client that set the watch, which occurs when the data for which the watch was set changes。

单触发

这个是很重要的语义,就是一次注册只会触发一次,而GUI等事件驱动编程模型中都不是单触发的。为什么要这样设计?

撩客户

从ZK watch event的英文定义看,这一点很容易理解:一个监控事件最后是发向注册事件的那个客户端。然而在文档的解释里就有一些不太好理解的东西,我先记录下来:


  • This implies that an event is on the way to the client, but may not reach the client before the successful return code to the change operation reaches the client that initiated the change.
  • Watches are sent asynchronously to the watchers. 
  • ZooKeeper provides an ordering guarantee: a client will never see a change for which it has set a watch until it first sees the watch event.
  • Network delays or other factors may cause different clients to see watches and return codes from updates at different times. 
  • The key point is that everything seen by the different clients will have a consistent order.
第一,二句很好理解:更新数据的客户端和监控数据的客户端在数据更新和更新消息上是异步的。既然是异步的,就会存在先后问题。有可能更新数据的客户端已经收到服务器的返回代码表示数据已经更新,而监听更新的客户端并没有收到更新通知。这个要求我们在编写程序的时候不要假设接收端已经收到消息 —— 对于有MQ编程经验的人来说,这个很好理解。
第三句我暂时理解为:不要期望你可以通过轮询能更快获得最新数据,事实上最快获得更新数据的只有监控器。
第四句和第一,二句并没有太大区别。
第五句我有点怀疑是说:不同客户之间有时间差,但同一客户自己是确保次序的。

仅数据

这个地方其实是解释了“数据”是什么的问题。原文提出两种思考方法,一是把数据和children list分开,另一咱是干脆把children list也看成是数据的一种。

监控器的维护

  • “Watches are maintained locally at the ZooKeeper server to which the client is connected.”这个需要结合整个ZK的分布式架构来理解。监控器必须有人(server)来维护。按这句话的意思,监控器只在单个服务器上维护(不知道会不会有单点问题)。
  • When a client connects to a new server, the watch will be triggered for any session events.

消息类型





No comments: