主要讲解了 ZooKeeper 的网络通信协议。
通信协议请求部分
Bit Offset | 0 - 3 | 4 - 11 | 12 - n | |||
4 - 7 | 8 - 11 | 12 - 15 | 16 - (n-1) | n | ||
Protocol Part | len | xid | type | len | path | watch |
请求头:RequestHeader
public class RequestHeader implements Record {
private int xid;
private int type;
请求体:Request
ConnectRequest: 会话创建
public class ConnectRequest implements Record {
//协议版本号
private int protocolVersion;
//最后一次接到的服务器ZXID
private long lastZxidSeen;
//会话超时时间
private int timeOut;
//会话标识
private long sessionId;
//会话密码
private byte[] passwd;
GetDataRequest:获取节点数据
public class GetDataRequest implements Record {
//节点路径
private String path;
//是否注册Watch标识
private boolean watch;
SetDataRequest:更新节点数据
public class SetDataRequest implements Record {
//节点路径
private String path;
//数据内容
private byte[] data;
//版本号
private int version;
通信协议响应部分
Bit Offset | 0 - 3 | 4 - 19 | 20 - n | |||||
4 - 7 | 8 - 15 | 16 - 19 | 20 - 23 | len 位 | 48 位 | 8 位 | ||
Protocol Part | len | xid | zxid | err | len | data | .... | pzxid |
上表48位详情
8位 | 8位 | 8位 | 8位 | 4位 | 4位 | 4位 | 8位 | 4位 | 4位 |
czxid | mzxid | ctime | mtime | version | cversion | aversion | ephemeral owner | dataLength | numChildren |
响应头:ReplyHeader
public class ReplyHeader implements Record {
private int xid;
private long zxid;
private int err;
xid 和上文中提到的请求头中的 xid 是一致的,响应中只是将请求中的 xid 原值返回。zxid 代表 ZooKeeper 服务器上当前最新的事务 ID。err 则是一个错误码,当请求处理过程中出现异常情况时,会在这个错误码中标识出来,常见的包括处理成功(Code.OK:0)
、节点不存在(Code.NONODE:101)
和没有权限(Code.NOAUTH:102)
等,所有这些错误码都被定义在类org.apache.zookeeper.KeeperException.Code
中。
响应体:Response
ConnectResponse:会话创建
public class ConnectResponse implements Record {
//协议的版本号
private int protocolVersion;
//会话超时时间
private int timeOut;
//会话标识
private long sessionId;
//会话密码
private byte[] passwd;
GetDataResponse:获取节点数据
public class GetDataResponse implements Record {
//数据内容
private byte[] data;
//节点状态
private org.apache.zookeeper.data.Stat stat;
SetDataResponse:更新节点数据
public class SetDataResponse implements Record {
//最新节点状态
private org.apache.zookeeper.data.Stat stat;