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/
标签:zk,server,State,client,go,连接 From: https://www.cnblogs.com/WJQ2017/p/17778013.html