大数据系列分布式中间件-MQ系列

zk的技术内幕

2019-06-20  本文已影响3人  光小月

来源:https://www.cnblogs.com/f1194361820/p/5514962.html

本章文章内容与之前内容有重叠部分

ZooKeeper 数据模型

见: https://www.cnblogs.com/f1194361820/p/5514962.html

树形的目录结构,跟文件系统结构似的。分为ZNode

连接的区别:

临时节点(ephemeral)与 持久型节点连接区别

State

每个ZNode除了自身的path外,还有一个Stat:

image image image

Watcher

Watcher工作原理

Watcher其实是一个Event的Handler。当发生指定事件后,会执行Watcher.process()方法。

Watcher事件说明

image

Watcher注册

image

1、通过上面的描述,知道可以通过exists,getData,getChildren来注册Watcher。

其中exists、getData方法注册的Watcher时用于处理指定节点的。

2、创建会话时,指定默认的Watcher

如果了解过ZooKeeper Java Client API的话,就可以知道getData、exists、getChildren方法都有一种使用默认Watcher的调用方式:

public Stat exists(String path, boolean watch);
public byte[] getData(String path, boolean watch, Stat stat);
public List<String> getChildren(String path , boolean watch);

这个boolean 标识就是表示是否使用默认的Watcher。如果是true,则表示使用默认的watcher,如果为false,则表示不注册Watcher。

指定默认的Watcher的方式有两种:

方式一:使用ZooKeeper构造器创建ZooKeeper client对象时。

image

方式二:在使用Zookeeper Client时,使用register方法。

image

另外,注册的Watcher只会存储在Client的 WatchManager中,不会发给服务端。

事件发布

服务端对节点进行操作(增加子节点、删除节点、修改节点数据)后,就会发布事件。服务端处理过程如下:

image

上面说的Watcher,并不是一个真实的Watcher对象,因为客户端在注册Watcher时,根本就没有把Watcher序列化传输给服务端。所以这上面说的Watcher,可以理解为Client注册的Watcher的一个引用。服务端其实只是把事件发给客户端而已

客户端接收到响应后,如果响应头中replyHdr中标识了XID为-1时,就认为是一个事件通知类的响应,接下来处理过程大体分为以下4步:

image

需要注意的是:

在进行Watcher回调时,会从WatchManager取出与相关path关联的多个Watcher(此时WatchManager中就不会再有这个path相关的Watcher了),然后串行的调用这多个Watcher#process方法。
所以在编程时,会根据业务的需要,有可能会反复注册Watcher。另外因为多个Watcher的调用是串行的,所以不要因为一个Watcher的处理逻辑影响了整个客户端的Watcher回调。

PS: 若你觉得可以、还行、过得去、甚至不太差的话,可以“关注”或者“点赞”一下,就此谢过!

上一篇 下一篇

猜你喜欢

热点阅读