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

[经验分享] Zookeeper 3.3.3消息序列化格式解析

[复制链接]

尚未签到

发表于 2015-11-22 09:15:38 | 显示全部楼层 |阅读模式
  Zookeeper 客户端使用Packet来管理消息,. Packet管理 请求包头(RequestHeader)和请求包体(Record的不同实现,类似于ExistsRequest在调用zookeeper.exists时发送),应答包头(ReplyHeader)和应答包体(Record的不同实现,类似于ExistsResponse). 与服务器进行通信时,依靠自己实现序列化方式来序列化请求包头以及请求包体,并且反序列化应答包头以及应答包体。
  

请求包序列化格式:
  第一部分:4个字节表示整个包的长度(包头+包体)
  第二部分:关注RequestHeader 类,Header包头,总共8个字节,前4个字节表示客户端生成的xid,用于跟踪包,采用自增方式生成的,需要服务器在响应时返回,后四个字节表示本包的操作类型:即ZooDefs.OpCode,它是一个整数值,分别代表"notification", "create","delete", "exists","getData", "setData", "getACL","setACL","getChildren", "getChildren2","getMaxChildren",
"setMaxChildren", "ping"。getChildren和getChildren2操作的区别在于是否返回Stat统计数据,返回统计数据Stat的操作是getChildren2。
  第三部分:关注Record接口的任何实现类,optional,因此长度字节数不固定,可以没有这一部分,例如ping操作,检测心跳不需要任何其他额外信息,只发Header,更多时候第三部分是存在的,根据第二部分的操作类型,可能需要提供一个操作的具体信息,例如操作路径path,是否watch等等,根据包体自己的方式来序列化。例如ExistsRequest

public void serialize(OutputArchive a_, String tag) throwsjava.io.IOException {
a_.startRecord(this,tag);
a_.writeString(path,"path");
a_.writeBool(watch,"watch");
a_.endRecord(this,tag);
}
  对于SetData操作来说,它包含有数据以及版本号:

public void serialize(OutputArchive a_, String tag) throwsjava.io.IOException {
a_.startRecord(this,tag);
a_.writeString(path,"path");
a_.writeBuffer(data,"data");
a_.writeInt(version,"version");
a_.endRecord(this,tag);
}

DSC0000.gif

应答包序列化格式:
  和请求包格式差不多,也分为三个部分
  第一部分:4个字节表示整个应答包的长度(包头+包体)
  第二部分:关注ReplyHeader类,16个字节长度,前面4个字节是xid,中间8个字节是zxid,表示事务id,最后4个字节表示err信息.

public void deserialize(InputArchive a_, String tag) throwsjava.io.IOException {
a_.startRecord(tag);
xid=a_.readInt("xid");
zxid=a_.readLong("zxid");
err=a_.readInt("err");
a_.endRecord(tag);
}
  Err的值请关注Code类
  第三部分:关注Record接口的任何实现类,例如对于ExistResponse。

public void deserialize(InputArchive a_, String tag) throwsjava.io.IOException {
a_.startRecord(tag);
stat= new org.apache.zookeeper.data.Stat();
a_.readRecord(stat,"stat");
a_.endRecord(tag);
}
  包体包含一个stat的统计信息。
  
  

DSC0001.gif
  客户端和服务器在交互时,有几个特殊的xid,分别的表示含义如下:
  Request: Xid: -8表示reconnect时重新设置watches, -2表示ping 包,-4表示auth
  Response: xid -2 表示ping的响应,-4 表示auth的响应,-1表示本次响应时有watch事件发生



注:
  客户端两个线程:一个发送线程,一个事件线程,发送线程从队列中依次发送请求,并接收响应,客户端生成xid,服务器返回这个xid,通过对比xid来保证接收到的消息有序,如果不是有序的,那么表示有消息丢失,丢失后,客户端会重新使用sessionid进行再一次连接服务器,每一次连接timeout或者readtimeout或者消息丢失都会导致之前注册的watch被保留,同步方法调用会抛出异常,异步调用方法会导致processResult调用,所有等待发送到服务器的outgoingQueue和已经发送去服务器等待应答的pendingQueue都将被clear。当session失效,那么这两个线程都会退出,需要重新创建一个zookeeper实例才能重新进行连接。

运维网声明 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-142001-1-1.html 上篇帖子: Zookeeper 3.3.3 Transaction Logs&Snapshot 序列化 下篇帖子: ZooKeeper Connection Loss 异常
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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