zoukankan      html  css  js  c++  java
  • 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 | 值: 持久化节点
    -------------------------------------------------------------------------------------------------------------------------------



  • 相关阅读:
    几个华为5300交换机故障的意思和可能产生的原因
    怎么让win7右下角只显示时间不显示日期 ?(可行)
    Linux下LDAP统一认证解决方案
    教你如何禁用U盘、屏蔽USB端口的三种方法
    开机自动启动一个新建文件夹
    端口
    输//ip提示找不到应用程序
    java单向加密算法小结(2)--MD5哈希算法
    java单向加密算法小结(1)--Base64算法
    Git初探--笔记整理和Git命令详解
  • 原文地址:https://www.cnblogs.com/LiZhiW/p/4942730.html
Copyright © 2011-2022 走看看