更多精彩内容,请关注微信公众号:后端技术小屋
zk client: github.com/samuel/go-zookeeper
zookeeper 是一款流行的分布式协调组件,被广泛用于 leader 选举、分布式锁、服务发现、名称服务、配置中心等场景。
zk client 与 zk server 在建立连接、保持连接、断开连接的过程中,会经历各种状态。如下所示
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 端连接发生异常,可分为三种情况:
推荐阅读
更多精彩内容,请扫码关注微信公众号:后端技术小屋。如果觉得文章对你有帮助的话,请多多分享、转发、在看。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.