如何检测 Apache Zookeeper 会话何时丢失或超时?

How to detect when Apache Zookeeper sessions are lost or timed out?

假设我们有一个 Apache Zookeeper 法定人数,运行 和 n 客户端节点已连接(使用 Apache Curator)。当任何其他节点会话终止或达到超时时,是否有可能在其中一个节点(我们正在观察的节点)上收到来自 zookeeper 的通知?如果是这样,这是如何实现的?

答案相当简单,可以使用临时节点和 PathChildrenCache 来完成。 Zookeeper 将检测节点何时超时(在本例中我们将超时设置为 10 秒)并且关联的临时节点将从树中消失。这将触发一个我们可以监听的事件。

首先与curator客户端建立连接,并在所有节点上启动

CuratorFramework curator =
    CuratorFrameworkFactory
        .newClient(zkConnectionString, 10000, 10000, retryPolicy);

curator.start();
curator.getZookeeperClient().blockUntilConnectedOrTimedOut();

接下来使用 PathChildrenCache 为 zookeeper 事件分配侦听器。事件类型包括 CHILD_ADDED、CHILD_UPDATED 和 CHILD_REMOVED。回调中的事件对象将包含发生故障的节点的相关信息(以及可能关联的负载)。

PathChildrenCache pathCache = new PathChildrenCache(curator, "/nodes", true);
pathCache
    .getListenable()
    .addListener((curator, event) -> {
        if (event.getType() == Type.CHILD_REMOVED) {
            System.out.println("Child has been removed");
        }
    });
pathCache.start();

现在在远程节点上,添加临时节点(这里我们给它一个没有有效负载的 ID 33)

curator
    .create()
    .creatingParentsIfNeeded()
    .withMode(CreateMode.EPHEMERAL)
    .forPath("/nodes/33");

现在拔下远程节点的插头,应该会在已分配侦听器的位置检测到事件。