目前kazoo是连接zk的最新第三方库,最新更新时间为2019年1月,其他第三方连接zk的库都长时间未更新,所以推荐使用kazoo。前面有几篇文章都已经详细给出了zk的部署,接下来是zk最核心的地方,将zk的数据结构特性跟业务场景相结合,实现复杂需求,本文给出基本demo用法介绍。
1、监控节点数量的变化
基本操作,创建、更新、删除,kazoo接口已经足够简单,入参类型如果不懂,可以直接看源码,同时也有助于深入了解别人是如何构思python“中间件”
from kazoo import exceptions
from kazoo.client import KazooClient
from kazoo.client import ChildrenWatch
from kazoo.client import DataWatch
def normal_test(zk_path,host,port,node_list):
zk=KazooClient(hosts=host+':'+port,timeout=5)
zk.start(timeout=5)
if not zk.exists(zk_path):
print("node:{} does't exists".format(zk_path))
# 创建当前节点,持久性节点,值需要设为byte类型
zk.create(path=zk_path,value=b'bar')
# 这里是获取当前节点的子节点列表,可以设定watch以及是否返回节点数据
child_node_list=zk.get_children(zk_path,watch=None,include_data=False)
# 创建多个子节点,值可以设为一样,因为这里关注子节点是否存在,不关心其值
if not child_node_list:
for sub_node in node_list:
zk.create(zk_path + '/' + sub_node,b'1')
else:
print('subnode list:{}'.format(child_node_list))
# 获取当前节点的znode对象:含data和ZnodeStat对象
data,stat=zk.get(zk_path)
print('current node data:{}'.format(data))
print('data version:{}'.format(stat.version))
print('data length:{}'.format(stat.data_length))
print('children node numbers:{}'.format(stat.numChildren))
# 更新节点数据,可以指定值和版本,成功更新则ZnodeStat 对象
stat_new=zk.set(zk_path,value=b'foo')
print('node {0} is updated:{1}'.format(zk_path,stat_new))
# 删除当前节点,若当前节点有子节点,则提示无法删除,需要使用递归删除
zk.delete(zk_path,recursive=True)
try:
last=zk.get_children(zk_path)
print('children nodes :{}'.format(last))
except exceptions.NoNodeError