前言

本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和参考文献请见1000个问题搞定大数据技术体系

正文

Watch 机制的简介

ZooKeeper 提供了分布式数据发布/订阅功能,一个典型的发布/订阅模型系统定义了一种一对多的订阅关系,能让多个订阅者同时监听某一个主题对象,当这个主题对象自身状态变化时,会通知所有订阅者,使他们能够做出相应的处理。

在 ZooKeeper 中,引入了 Watch 机制来实现这种分布式的通知功能。

ZooKeeper 允许客户端向服务端注册一个 Watch 监听,当服务端的一些事件触发了这个 Watch ,那么就会向指定客户端发送一个事件通知,来实现分布式的通知功能。

关于发布订阅模式的更多内容可以参考我的这篇博客——你怎么看待发布订阅模式的?

Watch 机制的特点

一次性触发

当 Watch 的对象发生改变时,将会触发此对象上 Watch 所对应的事件,这种监听是次性的,后续再次发生同样的事件,也不会再次触发。

事件封装

ZooKeeper 使用 WatchedEvent 对象来封装服务端事件并传递。

该对象包含了每个事件的 3 个基本属性,即通知状态( keeperState )、事件类型( EventType )和节点路径( path )。

异步发送

Watch 的通知事件是从服务端异步发送到客户端的

先注册再触发

ZooKeeper 中的 Watch 机制,必须由客户端先去服务端注册监听,这样才会触发事件的监听,并通知给客户端。

Watch 机制的通知状态和事件类型

同一个事件类型在不同的连接状态中代表的含义有所不同,下表列举了常见的连接状态和事件类型。

连接状态 状态含义 事件类型 事件含义
Disconnected 连接失败 NodeCreated 节点被创建
SyncConnected 连接成功 NodeDataChanged 节点数据变更
AuthFailed 认证失败 NodeChildrenChanged 子节点数据变更
Expired 会话过期 NodeDeleted 节点被删除

从表可知, ZooKeeper 常见的连接状态和事件类型分别有 4 种,具体含义如下。

状态

  1. 当客户端断开连接,这时客户端和服务器的连接就是 Disconnected 状态,说明连接失败;
  2. 当客户端和服务器的某一个节点建立连接,并完成一次 version 、 zxid 的同步,这时客户端和服务器的连接状态就是 SyncConnected ,说明连接成功;
  3. 当 ZooKeeper 客户端连接认证失败,这时客户端和服务器的连接状态就是 AuthFailed ,说明认证失败;
  4. 当客户端发送 Request 请求,通知服务器其上一个发送心跳的时间,服务器收到这个请求后,通知客户端下ー个发送心跳的时间是哪个时间点。
    当客户端时间戳达到最后一个发送心跳的时间,而没有收到服务器发来的新发送心跳的时间,即认为自己下线,这时客户端和服务器的连接状态就是 Expired 状态,说明会话过期。

事件

  1. 当节点被创建时,NodeCreated 事件被触发;
  2. 当节点的数据发生变更时,NodeDataChanged 事件被触发;
  3. 当节点的直接子节点被创建、被删除、子节点数据发生变更时,NodeChildrenChanged 事件被触发;
  4. 当节点被删除时,NodeDeleted 事件被触发。
上一篇 下一篇