02 发布订阅模式:使用Watch机制实现分布式通知

Watch -> 分布式环境下的观察者模式


一般的观察者模式,是通过创建一个列表来存放观察者。而Zookeeper中是在客户端和服务器端分别实现两个存放观察者列表,即:ZKWatchManager 和 WatchManager, 其核心操作就是围绕这两个展开的。

客户端Watch注册实现过程

在发送一个Watch监控事件的会话请求时,Zookeeper客户端主要做了两个工作:

  • 1 标记该会话是一个带有Watch事件的请求;
  • 2 将Watch事件存储到ZKWatchManager(比如:getData时通过DataWatchRegistration类来保存watch事件和节点的对应关系)。

服务端Watch注册实现过程

  • 1 解析收到的事件是否带有Watch注册事件(通过FinalRequestProcessor 类中的processRequest函数实现的)
  • 2 将对应的Watch事件存储到WatchManager(当getDataRequest.getWatch()值为True时,表明该请求需要进行Watch监控注册,并通过zks.getZKDatabase().getData函数将Watch事件注册到服务端的WatchManager中)

服务端Watch事件的触发过程

  • 首先,封装一个具有会话状态、事件类型、数据节点3种属性的WatchEvent对象
  • 之后查询该节点注册到Watch事件,如果为空说明该节点没有注册过Watch事件,如果之后存在Watch事件则添加到定义的Watchers集合中,并在WatchManager管理中删除
  • 最后,通过调用process方法向客户端发送通知
posted @ 2021-04-13 12:34  bm小明  阅读(87)  评论(0编辑  收藏  举报