设为首页 收藏本站
查看: 761|回复: 0

[经验分享] 跟着实例学习ZooKeeper的用法: 临时节点

[复制链接]

尚未签到

发表于 2017-4-19 12:02:01 | 显示全部楼层 |阅读模式
使用Curator也可以简化Ephemeral Node (临时节点)的操作。 临时节点驻存在ZooKeeper中,当连接和session断掉时被删除。
比如通过ZooKeeper发布服务,服务启动时将自己的信息注册为临时节点,当服务断掉时ZooKeeper将此临时节点删除,这样client就不会得到服务的信息了。
 
PersistentEphemeralNode类代表临时节点。 通过下面的构造函数创建:

public PersistentEphemeralNode(CuratorFramework client,
PersistentEphemeralNode.Mode mode,
String basePath,
byte[] data)

参数说明:


  • client – client instance
  • mode – creation/protection mode
  • basePath – the base path for the node
  • data – data for the node

其它参数还好理解, 不好理解的是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 内部自己处理错误状态。
我们的例子创建了两个节点,一个是临时节点,一个事持久化的节点。 可以看到, client重连后临时节点不存在了。

package com.colobu.zkrecipe.node;
import java.util.concurrent.TimeUnit;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.nodes.PersistentEphemeralNode;
import org.apache.curator.framework.recipes.nodes.PersistentEphemeralNode.Mode;
import org.apache.curator.framework.state.ConnectionState;
import org.apache.curator.framework.state.ConnectionStateListener;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.curator.test.KillSession;
import org.apache.curator.test.TestingServer;
import org.apache.curator.utils.CloseableUtils;
public class PersistentEphemeralNodeExample {
private static final String PATH = "/example/ephemeralNode";
private static final String PATH2 = "/example/node";
public static void main(String[] args) throws Exception {
TestingServer server = new TestingServer();
CuratorFramework client = null;
PersistentEphemeralNode node = null;
try {
client = CuratorFrameworkFactory.newClient(server.getConnectString(), new ExponentialBackoffRetry(1000, 3));
client.getConnectionStateListenable().addListener(new ConnectionStateListener() {
@Override
public void stateChanged(CuratorFramework client, ConnectionState newState) {
System.out.println("client state:" + newState.name());
}
});
client.start();
//http://zookeeper.apache.org/doc/r3.2.2/api/org/apache/zookeeper/CreateMode.html
node = new PersistentEphemeralNode(client, Mode.EPHEMERAL,PATH, "test".getBytes());
node.start();
node.waitForInitialCreate(3, TimeUnit.SECONDS);
String actualPath = node.getActualPath();
System.out.println("node " + actualPath + " value: " + new String(client.getData().forPath(actualPath)));
client.create().forPath(PATH2, "persistent node".getBytes());
System.out.println("node " + PATH2 + " value: " + new String(client.getData().forPath(PATH2)));
KillSession.kill(client.getZookeeperClient().getZooKeeper(), server.getConnectString());
System.out.println("node " + actualPath + " doesn't exist: " + (client.checkExists().forPath(actualPath) == null));
System.out.println("node " + PATH2 + " value: " + new String(client.getData().forPath(PATH2)));
} catch (Exception ex) {
ex.printStackTrace();
} finally {
CloseableUtils.closeQuietly(node);
CloseableUtils.closeQuietly(client);
CloseableUtils.closeQuietly(server);
}
}
}
  http://ifeve.com/zookeeper-ephemeral-node/

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-366388-1-1.html 上篇帖子: ZooKeeper学习之client connect string的管理 下篇帖子: Zookeeper开源客户端框架Curator简介与示例
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表