0%

ZooKeeper 通信协议

主要讲解了 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;