09.Curator臨時節點


    使用Curator也可以簡化Ephemeral Node (臨時節點)的操作。 臨時節點駐存在ZooKeeper中,當連接和session斷掉時被刪除。 比如通過ZooKeeper發布服務,服務啟動時將自己的信息注冊為臨時節點,當服務斷掉時ZooKeeper將此臨時節點刪除,這樣client就不會得到服務的信息了。

1.PersistentEphemeralNode類

    PersistentEphemeralNode類代表臨時節點。其構造函數如下:
    
    
    
            
  1. /**
  2. * @param client client instance
  3. * @param mode creation/protection mode
  4. * @param basePath the base path for the node
  5. * @param data data for the node
  6. */
  7. public PersistentEphemeralNode(CuratorFramework client, Mode mode, String basePath, byte[] initData)
其它參數還好理解,不好理解的是PersistentEphemeralNode.Mode:
  • EPHEMERAL: 以ZooKeeper的 CreateMode.EPHEMERAL方式創建節點。
  • EPHEMERAL_SEQUENTIAL: 如果path已經存在,以CreateMode.EPHEMERAL創建節點,否則以CreateMode.EPHEMERAL_SEQUENTIAL方式創建節點。
  • PROTECTED_EPHEMERAL: 以CreateMode.EPHEMERAL創建,提供保護方式。
  • PROTECTED_EPHEMERAL_SEQUENTIAL: 類似EPHEMERAL_SEQUENTIAL,提供保護方式。
     保護方式是指一種很邊緣的情況:當服務器將節點創建好,但是節點名還沒有返回給client,這時候服務器可能崩潰了,然后此時ZK session仍然合法,所以此臨時節點不會被刪除。對於client來說,它無法知道哪個節點是它們創建的。
     即使不是sequential-ephemeral,也可能服務器創建成功但是客戶端由於某些原因不知道創建的節點。
     Curator對這些可能無人看管的節點提供了保護機制。 這些節點創建時會加上一個GUID。 如果節點創建失敗正常的重試機制會發生。 重試時, 首先搜索父path, 根據GUID搜索節點,如果找到這樣的節點, 則認為這些節點是第一次嘗試創建時創建成功但丟失的節點,然后返回給調用者。
注意:節點必須調用start方法啟動。 不用時調用close方法。 PersistentEphemeralNode 內部自己處理錯誤狀態。

2.編寫示例程序

    我們的例子創建了兩個節點,一個是臨時節點,一個事持久化的節點。可以看到,client重連后臨時節點不存在了。
   
   
   
           
  1. public class PersistentEphemeralNodeExample
  2. {
  3. private static final String PATH = "/example/ephemeralNode";
  4. private static final String PATH2 = "/example/node";
  5. public static void main(String[] args) throws Exception
  6. {
  7. CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181", new ExponentialBackoffRetry(1000, 3));
  8. client.getConnectionStateListenable().addListener(new ConnectionStateListener()
  9. {
  10. @Override
  11. public void stateChanged(CuratorFramework client, ConnectionState newState)
  12. {
  13. System.out.println("連接狀態:" + newState.name());
  14. }
  15. });
  16. client.start();
  17. PersistentEphemeralNode node = new PersistentEphemeralNode(client, Mode.EPHEMERAL, PATH, "臨時節點".getBytes());
  18. node.start();
  19. node.waitForInitialCreate(3, TimeUnit.SECONDS);
  20. String actualPath = node.getActualPath();
  21. System.out.println("臨時節點路徑:" + actualPath + " | 值: " + new String(client.getData().forPath(actualPath)));
  22. client.create().forPath(PATH2, "持久化節點".getBytes());
  23. System.out.println("持久化節點路徑: " + PATH2 + " | 值: " + new String(client.getData().forPath(PATH2)));
  24. KillSession.kill(client.getZookeeperClient().getZooKeeper(), "127.0.0.1:2181");
  25. System.out.println("臨時節點路徑:" + actualPath + " | 是否存在: " + (client.checkExists().forPath(actualPath) != null));
  26. System.out.println("持久化節點路徑: " + PATH2 + " | 值: " + new String(client.getData().forPath(PATH2)));
  27. CloseableUtils.closeQuietly(node);
  28. CloseableUtils.closeQuietly(client);
  29. }
  30. }

3.示例程序運行結果

    運行結果控制台:
   
   
   
           
  1. 連接狀態:CONNECTED
  2. 臨時節點路徑:/example/ephemeralNode | 值: 臨時節點
  3. 持久化節點路徑: /example/node | 值: 持久化節點
  4. 連接狀態:SUSPENDED
  5. 連接狀態:LOST
  6. 連接狀態:RECONNECTED
  7. 臨時節點路徑:/example/ephemeralNode | 是否存在: true
  8. 持久化節點路徑: /example/node | 值: 持久化節點
-------------------------------------------------------------------------------------------------------------------------------




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM