2017-03-01 57 views
1

假設我們有一個Apache Zookeeper仲裁啓動並運行,並且連接了n客戶端節點(使用Apache Curator)。當任何其他節點會話終止或達到超時時,是否可以從zookeeper接收其中一個節點(我們正在觀察的節點)上的通知?如果是這樣,這是如何完成的?如何檢測Apache Zookeeper會話何時丟失或超時?

+0

您想了解其他客戶端的會話丟失情況嗎?任何會話丟失?你能舉一個你想要找出的例子嗎? – Randgalt

+0

下面提供了答案 – Hegemon

回答

1

答案很簡單,可以使用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"); 

現在拉遠程節點上的插頭和事件應該是檢測到聽衆分配的位置。