zk client: github.com/samuel/go-zookeepernode
zookeeper是一款流行的分布式协调组件,被普遍用于leader选举、分布式锁、服务发现、名称服务、配置中心等场景。git
zk client与zk server在创建链接、保持链接、断开链接的过程当中,会经历各类状态。以下所示github
const ( // 暂未使用 StateUnknown State = -1 // 与zk server之间的链接断开(也包含初始状态),此时zk client会不断重连 StateDisconnected State = 0 // 与zk server创建链接以前的暂时状态,表示即将connect zk server StateConnecting State = 1 // 暂未使用 StateAuthFailed State = 4 // 暂未使用 StateConnectedReadOnly State = 5 // 暂未使用 StateSaslAuthenticated State = 6 // 在和zk server从新创建TCP链接以后,握手阶段发现session超时 StateExpired State = -112 // 在和zk server成功创建TCP链接以后的状态 StateConnected = State(100) // 和zk server成功创建TCP链接,而且成功握手(即成功建立session) StateHasSession = State(101) )
超时时间很大程度上影响了上述状态的转换,有三个超时时间值得关注:后端
func (c *Conn) setTimeouts(sessionTimeoutMs int32) { c.sessionTimeoutMs = sessionTimeoutMs sessionTimeout := time.Duration(sessionTimeoutMs) * time.Millisecond c.recvTimeout = sessionTimeout * 2 / 3 c.pingInterval = c.recvTimeout / 2 }
// Connect establishes a new connection to a pool of zookeeper // servers. The provided session timeout sets the amount of time for which // a session is considered valid after losing connection to a server. Within // the session timeout it's possible to reestablish a connection to a different // server and keep the same session. This is means any ephemeral nodes and // watches are maintained
若是client和server端链接发生异常,可分为三种状况:微信
推荐阅读session
更多精彩内容,请扫码关注微信公众号:后端技术小屋。若是以为文章对你有帮助的话,请多多分享、转发、在看。
分布式