1
假设我们有一个Apache Zookeeper仲裁启动并运行,并且连接了n客户端节点(使用Apache Curator)。当任何其他节点会话终止或达到超时时,是否可以从zookeeper接收其中一个节点(我们正在观察的节点)上的通知?如果是这样,这是如何完成的?如何检测Apache Zookeeper会话何时丢失或超时?
假设我们有一个Apache Zookeeper仲裁启动并运行,并且连接了n客户端节点(使用Apache Curator)。当任何其他节点会话终止或达到超时时,是否可以从zookeeper接收其中一个节点(我们正在观察的节点)上的通知?如果是这样,这是如何完成的?如何检测Apache Zookeeper会话何时丢失或超时?
答案很简单,可以使用Ephemeral节点和PathChildrenCache来完成。 Zookeeper会检测节点何时超时(在本例中,我们将超时设置为10秒),并且相关的临时节点将从树中消失。这将引发我们可以倾听的事件。
首先建立与策展人客户端的连接,并启动它的所有节点上
CuratorFramework curator =
CuratorFrameworkFactory
.newClient(zkConnectionString, 10000, 10000, retryPolicy);
curator.start();
curator.getZookeeperClient().blockUntilConnectedOrTimedOut();
下一页使用PathChildrenCache分配的饲养员事件侦听器。事件类型包括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();
现在在远程节点上,添加了短暂的节点(在这里我们给它的33的ID没有有效载荷)
curator
.create()
.creatingParentsIfNeeded()
.withMode(CreateMode.EPHEMERAL)
.forPath("/nodes/33");
现在拉远程节点上的插头和事件应该是检测到听众分配的位置。
您想了解其他客户端的会话丢失情况吗?任何会话丢失?你能举一个你想要找出的例子吗? – Randgalt
下面提供了答案 – Hegemon