Roland Qi
Roland Qi
你可以看看curator的文档,自己思考思考为什么要新建一个定时器,如果网络分区了,导致ZOO_EXPIRED_SESSION_STATE没有收到怎么办? https://cwiki.apache.org/confluence/display/CURATOR/TN14
> > 你可以看看curator的文档,自己思考思考为什么要新建一个定时器,如果网络分区了,导致ZOO_EXPIRED_SESSION_STATE没有收到怎么办? > > https://cwiki.apache.org/confluence/display/CURATOR/TN14 > > 嗨,您好,请问可以详细说下吗?我觉得 自己建立定时器的话,可以在session expire 之后防止一次无意义的连接和handshake,并不会影响 ZOO_EXPIRED_SESSION_STATE,以及如果没有收到 ZOO_EXPIRED_SESSION_STATE的影响吧? 其实也并不是无意义的连接和handshake,zookeeper server就算认为一个session expired了,也会保留该session一段时间,等client来链接之后,通知其已经expired了,才会将这个session 删除。但是server里也有逻辑去清楚长时间expired的session。 但是定一个定时器是很有必要的,如果上层业务已经可以确认改session已经超时,就没必要依赖zk client库对着之前已经expired的一个session id无限重连 zk server,这个session连接很有可能已经因为因为网络分区连不上server了,也有可能运维原因或者zk代码bug,这个session已经再也连不上了。这时候另起一个session尝试重连zk server或许是个不错的选择。 还有一点就是,上层业务需要这个定时器去感知什么时候当前zk中的数据一定是stale了,比如说上层业务注册了一个临时节点,那么定时器到点的时候就是这个临时节点肯定失效的时候,那么对应的业务可能就需要有有对应的状态更改。