zoukankan      html  css  js  c++  java
  • zookeeper go客户端原理总结

    〇、环境

    zk client: github.com/samuel/go-zookeeper

    一、zk client状态

    zookeeper是一款流行的分布式协调组件,被广泛用于leader选举、分布式锁、服务发现、名称服务、配置中心等场景。

    1. 状态含义

    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)
    )
    

    2. 状态转换

    二、超时时间

    超时时间很大程度上影响了上述状态的转换,有三个超时时间值得关注:

    • sessionTimeout: session超时。当client与某个zk server连接异常时,会重连连接其他zk server。只要在sessionTimeout之内成功建立TCP连接并握手成功,临时节点、watcher都会作为已有session的资源得到保留。特别要注意的是,sessionTimeout并非完全由client端设置,它由client和server端协商确定:它必须介于server端配置的sessionTimeout上限和下限之间。
    • pingInterval: 是zk client和server保持心跳的时间间隔,默认1/3 * sessionTimeout
    • recvTimeout:默认2/3 * sessionTimeout。client端发送请求和接收响应(包含心跳)的超时时间。另外client握手阶段的读写超时为10 * recvTimeout。
    • connectTimeout: client端与zk server建立TCP连接的超时
    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端连接发生异常,可分为三种情况:

    • 一直无法成功建立连接。此时zk client在connect()中死循环,此时zk服务处于不可用状态。用户可根据业务的具体情况,让应用或退出,或降级,或死循环直到zk服务恢复。
    • sessionTimeout内成功建立连接。临时节点和watcher得以保留,不做任何处理
    • sessionTimeout内没有成功建立连接,但是后来成功了。此时应用应当重置内部与zk相关的状态,或者主动退出。

    推荐阅读

    更多精彩内容,请扫码关注微信公众号:后端技术小屋。如果觉得文章对你有帮助的话,请多多分享、转发、在看。
    二维码

  • 相关阅读:
    洛谷 P1875 佳佳的魔法药水
    洛谷 P4822 [BJWC2012]冻结
    洛谷 P6175 无向图的最小环问题
    洛谷 P1312 Mayan游戏
    洛谷 P1311 选择客栈
    洛谷 T150024 矩形面积并(扫描线)
    洛谷 P1311 选择客栈
    洛谷 P1514 引水入城
    洛谷 P1310 表达式的值
    求和(团队题目)
  • 原文地址:https://www.cnblogs.com/taiyang-li/p/14450387.html
Copyright © 2011-2022 走看看