关于zookeeper:zookeeper-watch

4次阅读

共计 3049 个字符,预计需要花费 8 分钟才能阅读完成。

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 thinktik
Created /w1
# 设置对以后节点的监控
[zk: localhost:2181(CONNECTED) 23] get -w /w1
thinktik
# 以后节点变更后会有告诉
[zk: localhost:2181(CONNECTED) 24] set /w1 think

WATCHER::

WatchedEvent state:SyncConnected type:NodeDataChanged path:/w1

设置对子节点的监控

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

WATCHER::

WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/w1
Created /w1/sw1

本文原创链接: zookeeper watch

参考:

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