关于client
在client library中有2个主要的类:ZooKeeper和ClientCnxn。ZooKeeper类实现了大部分API,写client应用程序时必须实例化这个对象来建立一个session。一旦建立起一个session,ZooKeeper使用一个ID来关连这个session。这个ID实际上是由server side生成的(参考SessionTrackerImpl)。
ClientCnx类管理连接到server的连接。它维护一个可以连接的ZooKeeper的server列表,并当连接断掉的时候透明的切换到其他的server。当重连到一个其他的server时会使用同一个session(如果没有过期的话),client也会重置所有的watch(参考ClientCnxn.SendThread.primeConnection())。重置默认是开启的,可以通过设置disableAutoWatchReset来禁用。
关于序列化
序列化的作用就是使得消息和事务可以通过网络传送并存储到磁盘上,ZooKeeper使用发迹于Hadoop的Jute来做序列化。现在有两块基于此的代码。org.apache.jute包下的代码就是Jute编译的代码(ZooKeeper的开发团队早就讨论过要替换Jude,但至今没知道合适的方案,它工作得很好,还没有必要替换它)。
zookeeper.jute是最主要的定义文件。它包含了所有的消息定义和文件记录。下面是一个Jute定义的例子:
module org.apache.zookeeper.txn {
...
class CreateTxn {
ustring path;
buffer data;
vector<org.apache.zookeeper.data.ACL> acl;
boolean ephemeral;
int parentCVersion;
}
...
}
这个例子定义了一个包含create事务的定义。这个模块映射到了一个ZooKeeper的package。