zk go client

发布时间 2023-10-20 21:18:53作者: 王景迁

go client

github.com/samuel/go-zookeeper
master分支

状态转换

zk client与zk server在建立连接、保持连接、断开连接的过程中,会经历各种状态。

zk/constants.go

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

zk客户端在建立连接时,会返回3个参数,其中第2个参数用于检测连接状态,仅是StateHasSession时,客户端才是可用的。
调用Connect方法时,通过goroutine去异步建立连接,方法返回时连接没有建立成功,第3个参数error为空也不代表连接已经建立。
zk/conn.go

go get github.com/samuel/go-zookeeper/zk
package main

import (
	"github.com/samuel/go-zookeeper/zk"
	"log"
	"time"
)

func main() {
	var err error
	var evtchan <-chan zk.Event
	var evt zk.Event

	_, evtchan, err = zk.Connect([]string{"172.17.0.3:2181"},
		time.Second*5,
		zk.WithLogInfo(false),
	)
	if err != nil {
		log.Fatalf("zk connect error:%v\n", err.Error())
		return
	}

	log.Printf("=====>  before loop check  <=======")
	//check the zkclient's state until it's the state of "StateHasSession"
	for {
		evt = <-evtchan
		log.Printf("zk event:%s %s\n", evt.Type, evt.State)
		if evt.State == zk.StateHasSession {
			break
		}
	}
}
GOOS=linux GOARCH=amd64 go build -o test_connect_zk test_connect_zk.go

超时时间

sessionTimeout
session超时。当client与某个zk server连接异常时,会重连连接其他zk server。只要在sessionTimeout之内成功建立TCP连接并握手成功,临时节点、watcher都会作为已有session的资源得到保留。sessionTimeout由client和server端协商确定,介于server端配置的sessionTimeout上限和下限之间。
pingInterval
协程中go zk client和server保持心跳的时间间隔,默认1/3 * sessionTimeout。
recvTimeout
默认2/3 * sessionTimeout。client端发送请求和接收响应(包含心跳)的超时时间。另外client握手阶段的读写超时为10 * recvTimeout。
connectTimeout
client端与zk server建立TCP连接的超时

zk/conn.go

watch事件

EventNodeCreated:watch不存在节点,节点创建后触发
EventNodeDeleted:watch已存在节点,节点删除后触发
EventNodeDataChanged:节点数据变化事件
EventNodeChildrenChanged:子节点数量改变事件(指定Path下增删子节点时触发)
EventNoWatching:watch移除事件
EventSession:会话事件

参考资料

https://backendhouse.github.io/post/zookeeper-client%E5%8E%9F%E7%90%86%E6%80%BB%E7%BB%93/

https://blog.csdn.net/pengpengzhou/article/details/109469649

https://aimuke.github.io/zookeeper/2019/06/18/zookeeper-watch/