首页 > 其他分享 >zk go client

zk go client

时间:2023-10-20 21:23:09浏览次数:37  
标签:zk server State client go 连接

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

相关文章

  • Django过滤器
    过滤器的用法#基本语法{{数据|过滤器:参数}} #前端用法<p>统计长度:{{s|length}}</p>#第一个参数是True就展示第一个参数的值、否则展示冒号后面的值<p>默认值:{{b|default:'为False时展示的值'}}</p><p>文件大小:{{file_size|filesizeformat}}</p><p>日期......
  • 关于Gorm配合Postgim的使用
    碰到一个问题,项目中需要引入坐标系统,而数据库选用是postgresql,那么理所当然的想到的就是用postgim插件,关于这个插件的使用,我们建议使用docker,doccker-compose配置如下version:'3.1'services:db:image:postgis/postgis:16-3.4restart:alwaysenvironment:......
  • django——Ajax(删除)
    1.在urls.py中编辑urlpath('order_delete',views.order_delete),2.在views.py中编写后端代码deforder_delete(request):uid=request.GET.get('uid')exists=models.Order.objects.filter(id=uid).exists()ifnotexists:retu......
  • Go语言环境安装
    一.下载安装包下载网站:Go下载-Go语言中文网-Golang中文社区(studygolang.com)选则对应的操作系统进行下载:直接一键安装,安装完后在cmd窗口输入“goversion"就可以查看Go版本,检测是否安装成功。也可以输入”goenv"查看环境二.配置环境变量需要工作目录GOROOT、......
  • RunnerGo 支持UI自动化的测试平台
    RunnerGo提供从API管理到API性能再到可视化的API自动化、UI自动化测试功能模块,覆盖了整个产品测试周期。RunnerGoUI自动化基于Selenium浏览器自动化方案构建,内嵌高度可复用的测试脚本,测试团队无需复杂的代码编写即可开展低代码的自动化测试。以一条简单的搜索场景为例,本文介绍Runn......
  • redis其他操作、redis管道、django中使用redis、django缓存、celery介绍、补充单例
    redis其他操作'''delete(*names)exists(name)keys(pattern='*')expire(name,time)rename(src,dst)move(name,db))randomkey()type(name)'''#redis的key值,最大可以是多少?最大不超过512M一般1KB#redis的value值,最大可以是多少?最大不超过512M......
  • mongo数据库$out输出覆盖原集合
    数据库版本:4.2.8操作系统:ubuntu20mongoaggregate中$out输出可以将原集合覆盖。问题复现:1、写入测试数据rs0:PRIMARY>useceshirs0:PRIMARY>db.t1.insert({id:1})rs0:PRIMARY>db.t1.insert({id:2})rs0:PRIMARY>db.t1.insert({id:3})rs0:PRIMARY>db.t1.insert({id:......
  • RunnerGo 支持UI自动化的测试平台
    RunnerGo提供从API管理到API性能再到可视化的API自动化、UI自动化测试功能模块,覆盖了整个产品测试周期。RunnerGoUI自动化基于Selenium浏览器自动化方案构建,内嵌高度可复用的测试脚本,测试团队无需复杂的代码编写即可开展低代码的自动化测试。 以一条简单的搜索场景为例,本文......
  • 如何使用 GoGoCode 一键 Vue2 转换 Vue3
    前言从今年年初开始,项目开始升级优化,将之前的Vue2旧版本整体升级到Vue3版本。在重写了几个Vue文件后,我发现做的都是一些机械性的工作,效率低且重复性大。于是就试着搜索了一下有没有什么能够批量转换代码格式的工具,发现了阿里的这个基于AST的JavaScript/Typescript/HTML......
  • Django名称空间
    当多个应用出现相同的别名时,反向解析的时候可能会出现冲突 解决办法: 方式一:利用名称空间的概念url(r'^app01/',include('app01.urls',namespaces='app01'))url(r'^index/$',views.index,name='xxx')reverse('app01:xxx'){%url'app01:......