`
javahigh1
  • 浏览: 1227189 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

ZK session客户端过期(Expired)过程

 
阅读更多

一般情况下,zk客户端与服务端建立连接后,会在2/3*sessionTime*1/2的时候发送一个心跳消息到服务端,保持会话更新。但是可能在某个时候网络中断可能导致客户端无法连接上服务端,此时客户端会不停的依次重试各个服务器,一直到连接上某个服务器为止。如果在未连接上这段时间内,服务端session已经过期,(参见SessionTracker的实现SessionTrackerImpl),它是依靠一个线程对过期的session进行清理,并关闭掉连接。


客户端在session过期后这段时间后,连接上某个服务器,并发送ConnectRequest,附带连接中断前的sessionid,以及lastZxid 等等消息,请求重新与服务器建立连接。服务器发现是一个ConnectRequest请求,于是readConnectRequest,如果sessionid不为0,则表示是需要恢复原来这个连接。

reopenSession恢复时,会对session做一些校验

由于sessionid已经过期被删除,所以touchSession时由于找不到sessionid,这里rc会返回false, 根据rc的值,finishSessionInit会确定发送什么样的ConnectResponse给客户端。

如果rc=false,同时服务端会发送关闭连接的指令。

客户端收到响应后,发现sessionTimeout时间小于或者等于0,则表示session过期。触发expired事件,并抛出异常。

整个客户端实例退出,这个实例不能再次重用了,如果还需要连接服务器,则需要重新创建新的zookeeper实例。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics