赞
踩
Watcher是一种简单的机制,使客户端得到关于ZooKeeper集合中的更改的通知。 客户端可以在读取特定znode时设置Watcher。Watcher会向注册的客户端发送任何znode(客户端注册表)更改的通知。
ZooKeeper Watch 机制是指,客户端在所有的读命令上告知服务端:这个节点或者子节点变化时通知我,具体来说,支持的写操作有:
例如,我们在命令行可以输入 get -w /foo,其中 -w 参数就是用于告知 ZooKeeper 服务端,当前客户端想在 /foo 节点上设置一个监听器。
ZooKeeper Watch 机制的两个细节:
本篇博客在客户端角度,从底层出发,看一下Zookeeper Watch机制。开始之前,先思考一下以下疑问,带着这些问题进行Zookeeper客户端的学习。
Copy From ZooKeeper客户端源码解读(网络I/O)
ClientCnxnSocket 封装了底层Socket通信层, ClientCnxnSocket整体结构如图所示:
Packet是ClientCnxn内部定义的一个对协议层的封装,作为ZooKeeper]中请求与响应的载体。
从上图可以看出,Packet中包含了请求头、响应头、请求体、响应体、节点路径和注册的Watcher等信息。
2.3.1 基本概念
SendThread是客户端ClientCnxn内部一个核心的I/O调度线程,用于管理客户端和服务端之间的所有网络I/O操作。在ZooKeeper客户端的实际运行过程中
Sender进程就一直尝试与Zookeeper服务器进行交互:
- //org.apache.zookeeper.ClientCnxn.SendThread
-
- @Override
- public void run() {
- // ...
- while (state.isAlive()) {
- clientCnxnSocket.doTransport(to, pendingQueue, ClientCnxn.this);
- }
- //...
- }
-
- // org.apache.zookeeper.ClientCnxnSocketNIO#doTransport
- void doTransport(...) {
- ...
- //监听Selector,对读和写进行操作
- for (SelectionKey k : selected) {
- ...
- if ((k.readyOps() & (SelectionKey.OP_READ | SelectionKey.OP_WRITE)) != 0) {
- //doIO
- doIO(pendingQueue, cnxn);
- }
- ...
- }
-
- }
-
- void doIO(Queue<Packet> pendingQueue, ClientCnxn cnxn) throws InterruptedException, IOException {
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。