zookeeper_cpp_client icon indicating copy to clipboard operation
zookeeper_cpp_client copied to clipboard

跟楼主讨论些问题

Open lanpay-lulu opened this issue 6 years ago • 4 comments

不知道楼主有没有看过zookeeper.h的注释,解决session timeout的重连并没有必要起一个定时器来做。zk的client库会在丢失连接后不停尝试重连,成功重连后,如果已经超时,会触发一个ZOO_EXPIRED_SESSION_STATE的事件,捕获该事件以后就可以做重新建立session的操作。

我自己深知写git项目的不易,但是楼主这个写法难免会误导写zk的新人,建议修改。

lanpay-lulu avatar Sep 11 '17 03:09 lanpay-lulu

你可以看看curator的文档,自己思考思考为什么要新建一个定时器,如果网络分区了,导致ZOO_EXPIRED_SESSION_STATE没有收到怎么办?

https://cwiki.apache.org/confluence/display/CURATOR/TN14

rolandqi avatar Nov 26 '20 06:11 rolandqi

你可以看看curator的文档,自己思考思考为什么要新建一个定时器,如果网络分区了,导致ZOO_EXPIRED_SESSION_STATE没有收到怎么办?

https://cwiki.apache.org/confluence/display/CURATOR/TN14

嗨,您好,请问可以详细说下吗?我觉得 自己建立定时器的话,可以在session expire 之后防止一次无意义的连接和handshake,并不会影响 ZOO_EXPIRED_SESSION_STATE,以及如果没有收到 ZOO_EXPIRED_SESSION_STATE的影响吧?

majianwei0705 avatar Mar 17 '21 09:03 majianwei0705

你可以看看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了,比如说上层业务注册了一个临时节点,那么定时器到点的时候就是这个临时节点肯定失效的时候,那么对应的业务可能就需要有有对应的状态更改。

rolandqi avatar Mar 17 '21 09:03 rolandqi

你可以看看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了,比如说上层业务注册了一个临时节点,那么定时器到点的时候就是这个临时节点肯定失效的时候,那么对应的业务可能就需要有有对应的状态更改。

嗯嗯,了解了,谢谢您~

majianwei0705 avatar Mar 18 '21 02:03 majianwei0705