ZooKeeper 客户端 ZKClient 源码读后感

在使用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以线程的方式执行(个人觉得这个部分写的还是挺精巧的)。
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下载地址
附录

注:本文对ZooKeeper Client简介 做了部分补充,更详细的可以看此贴