如何检测 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");
现在拔下远程节点的插头,应该会在已分配侦听器的位置检测到事件。
假设我们有一个 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");
现在拔下远程节点的插头,应该会在已分配侦听器的位置检测到事件。