2017-03-01 5 views
1

Angenommen, wir haben ein Apache Zookeeper-Quorum installiert und n Client-Knoten verbunden (mit Apache Curator). Ist es möglich, Benachrichtigungen von einem der Knoten (dem, den wir beobachten) vom Tierpfleger zu erhalten, wenn eine der anderen Knoten-Sitzungen beendet wird oder ein Timeout erreicht wird? Wenn ja, wie wird dies erreicht?Wie erkennt man, wenn Apache-Zookeeper-Sitzungen verloren gehen oder abgelaufen sind?

+0

Sie möchten über Sitzungsverlust von anderen Clients wissen? Jeder Sitzungsverlust? Können Sie ein Beispiel dafür geben, was Sie herausfinden wollen? – Randgalt

+0

Antwort unten zur Verfügung gestellt – Hegemon

Antwort

1

Die Antwort ist ziemlich einfach und kann mit Ephemeralknoten und PathChildrenCache erreicht werden. Zookeeper erkennt, wenn ein Knoten das Zeitlimit überschreitet (in diesem Beispiel setzen wir das Timeout auf 10 s) und der zugehörige ephemere Knoten wird aus dem Baum verschwinden. Dies wird ein Ereignis auslösen, auf das wir hören können.

zuerst eine Verbindung mit dem Kurator Client aufzubauen und es startet auf allen Knoten

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

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

Nächste Verwendung PathChildrenCache Zuhörer für zookeeper Ereignisse zuzuordnen. Zu den Ereignistypen gehören CHILD_ADDED, CHILD_UPDATED und CHILD_REMOVED. Das Ereignisobjekt in dem Rückruf enthält die relevanten Informationen (und mögliche zugehörige Nutzinformationen) des ausgefallenen Knotens.

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(); 

nun auf einem entfernten Knoten, fügen Sie den ephemeren Knoten (hier wir geben eine ID von 33 ohne Nutzlast)

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

nun den Stecker auf dem entfernten Knoten ziehen und das Ereignis sollte erkannt, wo die Listener zugewiesen wurden.

Verwandte Themen