【问题标题】:Is it possible to watch for events on all descendant nodes in ZooKeeper?是否可以监视 ZooKeeper 中所有后代节点上的事件?
【发布时间】:2012-08-19 08:23:56
【问题描述】:

当使用 ZooKeeper 时,是否可以监视后代 znode 上的所有事件?

例如,如果我有:

     (/)
     /  \
   (/a)  (/b)
   /       \
(/c)       (/d)

有没有办法观察根目录对 /a、/b、/c 和 /d 的更改?

【问题讨论】:

    标签: apache-zookeeper


    【解决方案1】:

    没有 ZooKeeper api 可以做到这一点,您必须自己编写。

    如果您使用Curator,您可以使用PathCache,它维护节点上的监视,以及该节点的子节点。当您发现正在观察的根的后代时,您可以编写一些代码来创建更多的 PathCache。

    如果您要推出自己的版本,实际上很难做到正确。这个blog 描述了一些问题。

    【讨论】:

      【解决方案2】:

      我知道这是一个老问题。我只是在这里发帖供像我这样的其他人参考。

      我也在找这个。按照@sbridges 的提示,我想我可以这样做。

      PathChildrenCache pathcache = new PathChildrenCache(client, "/some/path", true);
      
      PathChildrenCacheListener listner1 = new PathChildrenCacheListener() {
          Map<String, PathChildrenCache> listener2s = new HashMap<String, PathChildrenCache>();
          @Override
          public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception {
              String path = event.getData().getPath();
      
              if(event.getType() == Type.CHILD_ADDED) {
                  PathChildrenCache cache2 = new PathChildrenCache(client, path, true);
                  cache2.getListenable().addListener(this);
                  cache2.start();
                  listener2s.put(path, cache2);
              }
              else if(event.getType() == Type.CHILD_REMOVED) {
                  PathChildrenCache cache2 = listener2s.remove(path);
                  if(cache2 != null) cache2.close();
              }
      
              System.out.println("" + Thread.currentThread().getId() + "\t" + event);
          }
      };
      pathcache.getListenable().addListener(listner1);
      

      如果有人发现有问题,请告诉我。

      【讨论】:

      • 您可以在收到通知 (CHILD_ADDED) 和在孩子身上注册手表之间放松孩子的事件
      【解决方案3】:

      使用TreeCache 代替 PathCache

      【讨论】:

      【解决方案4】:

      如果您将 zookeeper 版本升级到 3.6.0,则可以使用 持久性递归监视。 见Persistent, Recursive WatchesZookeeper Watchers

      还有Curator Persistent Recursive Watcher 支持。

      【讨论】:

        猜你喜欢
        • 2013-12-02
        • 1970-01-01
        • 2014-02-24
        • 1970-01-01
        • 1970-01-01
        • 2018-03-18
        • 2011-10-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多