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