目录
一、Zookeeper watcher 事件机制原理剖析
1、客户端发送事件通知请求
2、服务端处理 watcher 事件的请求
3、服务端触发 watcher 事件流程:
4、客户端回调 watcher 事件
二、 Zookeeper 数据同步流程
三、Zookeeper 分布式锁实现原理
一、Zookeeper watcher 事件机制原理剖析
整个watcher事件机制,分为客户端注册、服务端处理、服务端触发通知、客户端回调四个过程。
其中客户端注册 watcher 有三种方式,调用客户端 API 可以分别通过 getData、exists、getChildren 实现,,以 exists 方法举例说明其原理
Java public class WatcherDemo implements Watcher {
static ZooKeeper zooKeeper; static {
try {
zooKeeper = new ZooKeeper("192.168.1.1:2181", 4000,new WatcherDemo()); } catch (IOException e) {
e.printStackTrace(); } } @Override public void process(WatchedEvent event) {
System.out.println("eventType:"+event.getType()); if(event.getType()==Event.EventType.NodeDataChanged){
try {
zooKeeper.exists(event.getPath(),true); } catch (KeeperException e) {
e.printStackTrace(); } catch (InterruptedException e) {
e.printStackTrace(); } } } public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
String path="/watcher"; if(zooKeeper.exists(path,false)==null) {
zooKeeper.create("/watcher", "0".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } Thread.sleep(1000); System.out.println("-----------"); //true表示使用zookeeper实例中配置的watcher Stat stat=zooKeeper.exists(path,true); System.in.read(); } } |
运行完程序,控制台显示:
此时启动 zookeeper 命令行终端,查看并且删除 watcher 节点:
IDE 控制台输出,触发了节点删除事件:
客户端发送请求给服务端是通过 TCP 长连接建立网络通道,底层默认是通过 java 的 NIO 方式,也可以配置 netty 实现方式。
注册 watcher 监听事件流程图: