NOTE

3.2 Zookeeper监听器原理

1. 事件监听机制是什么 Zookeeper 允许客户端向服务端的某个 Znode 注册一个 Watcher 监听,当服务端的一些指定事件触发了这个 Watcher,服务端会向指定客户端发送一个事件通知来实现分布式的通知功能,然后客户端根据 Watcher 通知状态和事件类型做出业务上的改变 设置监

ZooKeeper创建于 更新于 约 2 分钟读完historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. 事件监听机制是什么

Zookeeper 允许客户端向服务端的某个 Znode 注册一个 Watcher 监听,当服务端的一些指定事件触发了这个 Watcher,服务端会向指定客户端发送一个事件通知来实现分布式的通知功能,然后客户端根据 Watcher 通知状态和事件类型做出业务上的改变

设置监听后,节点数据或者结构变化后,zookeeper会通知客户端。 当前zk有如下四种事件

  • 节点创建
  • 节点删除
  • 节点数据改变
  • 子节点变更

2. 事件监听机制使用

  • 监听子节点变化
# 客户端1监听子节点变化
ls -w /zk_test

# 客户端2创建子节点
create /zk_test/test-4

# 客户端1触发监听事件
WATCHER::

WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/zk_test
  • 监听节点数据变化
# 客户端1监听节点数据变化
get -w /zk_test

# 客户端2修改节点数
set /zk_test oopp

# 客户端1触发监听事件
WATCHER::

WatchedEvent state:SyncConnected type:NodeDataChanged path:/zk_test

3. 事件监听机制注意

3.1. 对节点的watch监听通知是永久的吗

不是。Watch事件是一次性的触发器,当Watch的节点改变的时候,服务器会把这个改变推送给客户端,但是不会把改变的数据也推送过去,所以需要客户端在进行一次查询获取数据

3.1.1. 为什么不是永久的

举个例子,如果服务端变动频繁,而监听的客户端很多情况下,每次变动都要通知到所有的客户端,给网络和服务器造成很大压力。

4. 事件监听机制原理

zookeeper监听器原理

  • main线程中创建Zookeeper客户端;同时创建两个线程,connect负责网络连接通信,listener负责监听
  • connect线程将注册的监听事件发送给Zookeeper
  • Zookeeper把监听事件添加到监听器列表中
  • Zookeeper监听到有数据或路径变化,就会将这个消息发送给listener线程
  • listener线程内部调用了process()方法

5. 参考

讨论

使用 GitHub 账号参与讨论,评论会保存在 GitHub Issues 中。在 GitHub 查看