watch是什么

watchzookeeper的外围性能,client能够监控zookeepernode的状态变动以及node子节点的状态变动,一旦这些状态状态产生了扭转,zookeeper就会告诉这个node上的client,这样client就能做相应的业务逻辑了.

根据ZooKeeper Watches.咱们能够晓得zooKeeper中的所有读操作,也就是getData()getChildren()exists()都能够设置一个watch,以下是zooKeeperwatch的定义:watch事件是一次性触发器,当监控的node数据发生变化时产生,事件发送给设置watch的客户端.

watch的三个要点

在这个watch的定义中有三个要点须要思考:

  • 一次性:node的数据发生变化时,就是产生了一个事件,watch是一次性的,在被事件触发后这个watch就会生效.例如,如果client执行getData("/znode1",true),而后/znode1的数据被更改或删除,client将取得/znode1watch事件。如果/znode1再次更改,则不会发送任何watch事件,除非客户端再次读取并设置了一个新的watch

    • 这是一个很重要的知识点,就是一个watch会被重复的一类事件重复的触发么? 答案是不能,触发一次后watch就生效了,你须要再次设置watch来从新监听事件
  • 有序性: 产生到client的watch事件和更新node数据的操作是有先后顺序的,也就是先进行了node数据更新,node数据更新胜利后才会产生watch事件.client能力接到告诉.可能有人认为zookeeper只有接到node数据更新操作就会产生watch事件,这个假如是错的,zookeeper做到分布式一致性其实是有严格的有序性的.watch事件是被异步发送到client的,同时对于同一个watch事件如果有多个client监听的话,因为网络提早这些client可能会在事件的承受工夫上有轻微的偏差,不同客户端看到的所有操作仍然有统一的程序
  • watch事件是有类型的: node数据的扭转能够分为2个了类型,一个是node的数据被扭转,例外一个是node的子节点被扭转. zookeeper因而保护了2种watch事件列表:getData()和exists()能够设置数据扭转相干的watch,getChildren()能够设置node子节点相干的watch.咱们在设置watch的时候须要依照下面的类型进行抉择.

zookeeper对watch的保障

zookeeper保护了如下的保障

  • 有序性: watch是依据其余事件、其余watch和异步响应来排序的。ZooKeeper客户端库确保所有的事件都被有序地调度。
  • 事件产生在事件发送前: 一个事件必须在数据操作胜利后产生,而后才会发给watch. 事件的产生和事件的发送不是并行的,必须是先后关系
  • 事件的有序性: zookeeper会有多个watch,这些watch事件的产生的程序是和数据操作的程序统一的

应用watch要留神如下的问题

应用watch要留神上面几点:

  • watch是一次性的,当watch被触发而后发送给client后,前面同类的事件是不会再次发送到client了,你要继续的监听只能从新增加watch
  • 因为规范的手表是一次性触发器,并且在获取事件和发送一个新的申请来获取手表之间有提早,你不能牢靠地看到产生在ZooKeeper节点上的每一个变动。筹备好解决znode在获取事件和再次设置手表之间屡次更改的状况。(你可能并不在乎,但至多意识到这种状况可能会产生。)
  • A watch object, or function/context pair, will only be triggered once for a given notification. For example, if the same watch object is registered for an exists and a getData call for the same file and that file is then deleted, the watch object would only be invoked once with the deletion notification for the file.
  • When you disconnect from a server (for example, when the server fails), you will not get any watches until the connection is reestablished. For this reason session events are sent to all outstanding watch handlers. Use session events to go into a safe mode: you will not be receiving events while disconnected, so your process should act conservatively in that mode.

watch注册与处触发

如图下图所示:

  • exists操作上的watch,在被监督的Znode创立、删除或数据更新时被触发。
  • getData操作上的watch,在被监督的Znode删除或数据更新时被触发。在被创立时不能被触发,因为只有Znode肯定存在,getData操作才会胜利。
  • getChildren操作上的watch,在被监督的Znode的子节点创立或删除,或是这个Znode本身被删除时被触发。能够通过查看watch事件类型来辨别是Znode,还是他的子节点被删除:NodeDelete示意Znode被删除,NodeDeletedChanged示意子节点被删除。

Watch由客户端所连贯的ZooKeeper服务器在本地保护,因而watch能够非常容易地设置、治理和分派。当客户端连贯到一个新的服务器时,任何的会话事件都将可能触发watch。另外,当从服务器断开连接的时候,watch将不会被接管。然而,当一个客户端从新建设连贯的时候,任何先前注册过的watch都会被从新注册。

代码演示

设置以后节点的的watch

[zk: localhost:2181(CONNECTED) 22] create /w1 thinktikCreated /w1# 设置对以后节点的监控[zk: localhost:2181(CONNECTED) 23] get -w /w1thinktik# 以后节点变更后会有告诉[zk: localhost:2181(CONNECTED) 24] set /w1 thinkWATCHER::WatchedEvent state:SyncConnected type:NodeDataChanged path:/w1

设置对子节点的监控

# 监控以后节点的子节点相干的监控[zk: localhost:2181(CONNECTED) 25] ls -w -R /w1/w1# 子节点发送变动时会有告诉[zk: localhost:2181(CONNECTED) 26] create /w1/sw1WATCHER::WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/w1Created /w1/sw1

本文原创链接: zookeeper watch

参考:

  • 简历敢写 “相熟” zookeeper,这些基本概念要把握
  • 大牛整顿的ZooKeeper笔记