五、ZooKeeper 分布式事件

文章目录

    • 一、Watcher 标准的事件处理器
    • 二、Curator 缓存监听

一、Watcher 标准的事件处理器

在 ZooKeeper 中,接口类型 Watcher 用于表示一个标准的事件处理器,用来定义收到事件通知后相关的回调处理逻辑。

接口类型 Watcher 包含 KeeperState 和 EventType 这两个内部枚举类,分别代表了通知状态和事件类型。提供一个接口的事件回调方法:void process(WatchedEvent event);

定义并使用一个 Watcher 实例:

Watcher watcher = new Watcher() {
     
  @Override
  public void process(WatchedEvent event) {
     
    log.info("Watcher  Event: {}", event.toString());
  }
};

zooKeeper.exists("/aaa", watcher);

可以通过 getData、exists 和 getChildren 方法设置 Watcher 监听器实例。但这种方式只能监听一次,如果要一直监听需要反复注册。

一个 Watcher 监听器在向服务器完成注册后,当服务器的一些事件触发了这个 Watcher,就会向注册过的客户端发送一个事件通知来实现分布式的通知功能,客户端收到服务器端的通知后,会封装一个 WatchedEvent 事件实例,再传递给监听器的 process(WatchedEvent event) 回调方法。

WatchedEvent 包含了三个基本属性:

  • 通知状态 (KeeperState)
  • 事件类型 (EventType)
  • 节点路径 (path)

通过 上述方法 Watcher 需要反复注册。但改用通过 addWatch() 方法实现注册,则会反复收到事件通知

zooKeeper.addWatch("/aaa", watcher, AddWatchMode.PERSISTENT_RECURSIVE);

AddWatchMode 提供了两个类型:

  • PERSISTENT

    对一个指定目录设置 Watcher, 并且在触发事件后保留。可以反复收到事件通知。

  • PERSISTENT_RECURSIVE

    对一个指定目录设置 Watcher, 不仅对指定目录监控,还对递归下的子目录同样进行监控。并且在触发事件后保留。可以反复收到事件通知。

二、Curator 缓存监听

Curator 引入了 Cache 缓存机制的实现包括 Node Cache、Path Cache 和 Tree Cache 三组类型:

  1. Node Cache 点节缓存可用于 ZNode 节点的临听;
  2. Path Cache 子节点缓存可用于 ZNode 的子节点的监听;
  3. Tree Cache 树缓存是 Path Cach 的增强,能监听整棵节点树,不光能监听子节点,还能监听 ZNode 节点自身。
public static void main(String[] args) throws Exception {
     
    CuratorFramework client = CuratorWatcherTest.newClient();
    CountDownLatch latch = new CountDownLatch(1);
    String path = "/node";

    // 开启链接
    client.start();

  	// Node Cache
    NodeCache nodeCache = new NodeCache(client, path);
    NodeCacheListener nodeCacheListener = new NodeCacheListener() {
     
        @Override
        public void nodeChanged() throws Exception {
     
            ChildData childData = nodeCache.getCurrentData();
            log.info("NodeCache the node[{}] changed..............", childData.getPath());
            log.info("NodeCache the new data: {}..............", new String(childData.getData()));
        }
    };

    nodeCache.getListenable().addListener(nodeCacheListener);
    nodeCache.start(true);

    // Path Cache
    PathChildrenCache pathChildrenCache = new PathChildrenCache(client, path, true);
    PathChildrenCacheListener pathChildrenCacheListener = new PathChildrenCacheListener() {
     
        @Override
        public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception {
     
            ChildData childData = event.getData();
            log.info("PathChildrenCache the node[{}] changed..............", childData.getPath());
            log.info("PathChildrenCache the new data: {}..............", new String(childData.getData()));
        }
    };

    pathChildrenCache.getListenable().addListener(pathChildrenCacheListener);
    pathChildrenCache.start(true);

   // Tree Cache
    TreeCache treeCache = new TreeCache(client, path);;
    TreeCacheListener treeCacheListener = new TreeCacheListener() {
     
        @Override
        public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
     
            ChildData childData = event.getData();
            log.info("TreeCache the node[{}] changed..............", childData.getPath());
            log.info("TreeCache the new data: {}..............", new String(childData.getData()));
        }
    };
    treeCache.getListenable().addListener(treeCacheListener);
    treeCache.start();

    latch.await();
}

在新版本的Curator 中Node Cache、Path Cache 和 Tree Cache 对应的NodeCache、PathChildrenCache 和 TreeCache 已经是 Deprecated。

你可能感兴趣的:(ZooKeeper)