zookeeper源码阅读分析笔记--客户端服务端通信机制以及session超时、过期处理

    这两天看了一下zookeeper的相关的源码,版本基于3.4.5,代码结构还是比较清晰的;
这里重点分析一下zookeeper client和server端之间的通信以及相关的异常处理机制。  
1、客户端
  客户端几个主要的类为Zookeeper、ClientCnxn、SendThread、ClientCnxnSocketNIO。
客户端通过Zookeeper相关的API和server进行同步或者异步通信,包括create、delete、exists、getChildren、getData、setData、sync等,
在实现中zookeeper可以调用ClientCnxn.submit同步等待返回结果或者调用ClientCnxn.queuePacket把消息放到outgoing队列中异步发送并提供callback进行异步回调;
ClientCnxn负责管理client端的socket IO,维护zookeeper server列表,透明的在server之间连接切换;ClientCnxn有一个SendThread后台线程,
负责对outgoing queue中的消息发送和server端返回消息接收;ClientCnxnSocketNIO代表一个server端的NIO socket 长连接连接,负责和server端底层进行通信。
SendThread服务于queueQueue 进行package的发送接收,并启动后台线程心跳建立连接;pendingQueue用于存放已经发送出去,未回复的包,在收到回复后,
从pendingQueue队列中删除;SendThread从socket读取服务端返回的结果后,通过readResponse对消息进行处理,根据返回的replyHeader中xid进行相应的后续处理,
当xid=-2时候,表示这是一个ping的返回,当xid=-4,代表这是一个auth 的返回,当xid=-1时候,代表这是一个zookeeper节点变化导致的通知watch执行的消息返回,
返回的消息用watchEvent包装,发送到EventThread中的waitingEvents队列中,EventThread后台线程从队列中拉取消息执行watcher中的process逻辑。

   客户端和服务端之间的NIO socket连接模型这里就不多说了,以前的NIO 系列blog中对这些有比较多的阐述,
这里说一下客户端和服务端的长连接的session失效、超时、连接断掉的问题,客户端又是如何处理的;
ClientCnxn包括这几个变量,
private int connectTimeout;
private volatile int negotiatedSessionTimeout;
private int readTimeout;
private final int sessionTimeout;在client连接到server后,serve

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值