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

[经验分享] Zookeeper客户端库ZkClient

[复制链接]

尚未签到

发表于 2017-4-19 09:15:14 | 显示全部楼层 |阅读模式
  Zookeeper客户端库ZkClient
序言
直接使用zookeeper的api实现业务功能比较繁琐。因为要处理session loss,session expire等异常,在发生这些异常后进行重连。又因为ZK的watcher是一次性的,如果要基于wather实现发布/订阅模式,还要自己包装一下,将一次性订阅包装成持久订阅。另外如果要使用抽象级别更高的功能,比如分布式锁,leader选举等,还要自己额外做很多事情。这里介绍下ZK的第三方客户端包装小工具,可以分别解决上述小问题。
在使用ZooKeeper过程中发现,用原生方法实现某些业务功能很麻烦
例如:
1)如何实现持久的Watcher注册
ZooKeeper的Watcher是一次性的,用过了需要再注册;
2)如何解决session的超时问题
生产环境中如果网络出现不稳定情况,那么这种情况出现的更加明显;
3)如何实现领导选举
集群情况下可能需要实现stand by,一个服务挂了,另一个需要接替的效果;
4)如何实现节点数据的封装
项目中一般都会使用对象,而ZooKeeper只能存放文本类的数据。

ZKClient却能把这些问题解决了:
1)持久的Watcher注册问题:
ZKClient框架将事件重新定义分为了stateChanged、znodeChanged、dataChanged三种情况,用户可以注册这三种情况下的监听器(znodeChanged和dataChanged和路径有关),而不是注册Watcher。
ZKClient框架中ZooKeeper只注册了类ZkClient(实现了Watcher),由ZkClient统一处理WatchedEvent,根据WatchedEvent分发到三种情况的处理方法,处理方法在寻找到监听器后会将他send到ZkEventThread的BlockingQueue中,由ZkEventThread以线程的方式执行(个人觉得这个部分写的还是挺精巧的)。

 
zkClient将一次性watcher包装为持久watcher。后者的具体做法是简单的在watcher回调中,重新读取数据的同时再注册相同的watcher实例。
zkClient简单的使用样例如下:

public static void testzkClient(final String serverList) {
ZkClient zkClient4subChild = new ZkClient(serverList);
zkClient4subChild.subscribeChildChanges(PATH, new IZkChildListener() {
@Override
public void handleChildChange(String parentPath, List currentChilds) throws Exception {
System.out.println(prefix() + "clildren of path " + parentPath + ":" + currentChilds);
}
});



上面是订阅children变化,下面是订阅数据变化

ZkClient zkClient4subData = new ZkClient(serverList);
zkClient4subData.subscribeDataChanges(PATH, new IZkDataListener() {
@Override
public void handleDataChange(String dataPath, Object data) throws Exception {
System.out.println(prefix() + "Data of " + dataPath + " has changed");
}
@Override
public void handleDataDeleted(String dataPath) throws Exception {
System.out.println(prefix() + dataPath + " has deleted");
}
});



订阅连接状态的变化:

ZkClient zkClient4subStat = new ZkClient(serverList);
zkClient4subStat.subscribeStateChanges(new IZkStateListener() {
@Override
public void handleNewSession() throws Exception {
System.out.println(prefix() + "handleNewSession()");
}
@Override
public void handleStateChanged(KeeperState stat) throws Exception {
System.out.println(prefix() + "handleStateChanged,stat:" + stat);
}
});



zkClient除了做了一些便捷包装之外,对watcher使用做了一点增强。比如subscribeChildChanges实际上是通过exists和getChildren关注了两个事件。这样当create(“/path”)时,对应path上通过getChildren注册的listener也会被调用。另外subscribeDataChanges实际上只是通过exists注册了事件。因为从上表可以看到,对于一个更新,通过exists和getData注册的watcher要么都会触发,要么都不会触发。
2)session的超时问题:
ZKClient框架里会经常看见一些while语句,是由这些while语句完成的,比如ZkClient.retryUntilConnected方法
(感谢紫川的反馈,此条可能存在描述性问题。经校对:ZkClient貌似还是有对Session Expired 处理的,在ZkClient.processStateChanged方法中。虽然能重新连接,但是连接上是一个新的 session,原有创建的ephemeral znode和watch会被删除,程序上你可能需要处理这个问题。欢迎大家提出意见,万分感谢)

3)领导选举实现:
选举实现逻辑这里讲的很清楚
ZKClient框架提供了DistributedQueue可以对offer方法做适当修改来实现则个功能

4)节点数据的封装:
ZKClient框架提供了ZkSerializer来进行序列化和反序列化,貌似挺有用的。DataUpdater可以用来更新节点数据,进行znode数据转换。

总的来说ZKClient是一个不错的ZooKeeper调用工具,减少不少的开发量,设计精巧,收货不小。
ZKClient下载地址:
GitHub工程(zkClient官方地址)
maven工程(部分写了中文注释) 密码:tlbu

附录
ZooKeeper管理员指南

  参考:

Zookeeper Client简介
  ++——(+——(
  +
  ——)o
  )
  ——
  ——
  ——

运维网声明 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-366166-1-1.html 上篇帖子: ZooKeeper源码分析(二) 下篇帖子: Zookeeper的学习总结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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