ars*_*nal 10 python watch kazoo apache-zookeeper
我有一个非常奇怪的Python Kazoo库案例.我在下面的代码中做的是 -
一旦我使用kazoo库连接到Zookeeper,我创建一个短暂的节点,然后在其他节点上监视,然后我继续在无限循环中继续运行程序..我还为Zookeeper添加了一个监听器这也将监督国家.
对我来说一切都很好,短暂的节点是起来的,看我的znode也工作正常...
有时,由于连接中断或丢失,我看到很奇怪的行为.正如我上面提到的,我添加了一个监听器,动物园管理员将监视的状态,我有一个print语句以及..我总是看到,这些打印语句得到打印出来Lost,Suspended,Connected,我认为,由于连接中断,之后我的短暂节点消失了,我在znode上的监视也不起作用.
以下是我的代码,它永远运行 -
#!/usr/bin/python
from kazoo.client import KazooClient
from kazoo.client import KazooState
from kazoo.protocol.states import EventType
def watch_host(event):
print event
def my_listener(state):
if state == KazooState.LOST:
# Register somewhere that the session was lost
print "Lost"
elif state == KazooState.SUSPENDED:
# Handle being disconnected from Zookeeper
print "Suspended"
else:
# Handle being connected/reconnected to Zookeeper
# what are we supposed to do here?
print "Being Connected/Reconnected"
zk = KazooClient(hosts='127.0.0.1:2181')
zk.start()
zk.add_listener(my_listener)
# start an ephemeral node
zk.create("/my/example/h0", b"some value", None, True)
# put a watch on my znode
children = zk.get_children("/my/example/test1", watch=watch_host)
while True:
time.sleep(5)
Run Code Online (Sandbox Code Playgroud)
有没有办法克服这个问题?每当我的Zookeeper状态变为Lost或Suspended或时,我都希望这样Connected.我希望通过再次创建它来获得我的短暂节点(如果这是正确的方法)并且我在znode上的监视也始终正常工作.
因为我将永远运行我的程序所以无论出于何种原因如果Zookeeper状态由于连接中断而发生变化并且它自动再次连接回来,那么我需要确保我的短暂节点也已启动并且我的znode上的监视也开始工作自动..
目前我的短暂死亡,如果州自动改变,手表也不起作用..
知道如何克服这个问题吗?
这就是事情,当连接状态发生变化时,你的观察者也会被触发.有一个事件发给了守望者.它可以是nodeDataChanged或nodeChildrenChanged.但是,由于当您的会话终止或存在连接问题时,您无法收到您感兴趣的事件的通知,因此您的观察者将收到有关这些会话问题的通知.我相信这个事件的类型是"无".
来自http://zookeeper.apache.org/doc/trunk/zookeeperProgrammers.html#ch_zkWatches
关于手表的事情
所以,长话短说,你的观察者应该破解事件以查看它是什么类型,并通过进入某种故障转移模式适当地响应None类型.
我通常做的是我的Watcher对象也是听众.当重新连接发生时,我通过重置我的手表进行响应,确保检查是否存在适当的znodes并在必要时创建它们.
我对Python一无所知,但我想我会强调一些关于ZNodes
Znodes两种类型的基本观点:ephemeral或者persistent
ephemeral znode一旦创建客户端会话结束,ZooKeeper就会删除An .persistent znode当客户端(不一定是创建它的一个)显式删除一旦被创建后才能删除.ephemeral znode人永远不会有任何孩子,甚至没有孩子ephemeral.在Java版本(Java API)中,如果客户端连接到多个服务器,并且它与连接的服务器断开连接,那么我们会触发事件,KeeperState.Disconnected但它会重新尝试并连接到另一台服务器,在这段时间ephemeral znode和所有手表之间都是完整,即它们没有被销毁, 但一旦KeeperState.Expired调用了事件(当客户端无法在指定时间内与任何服务器建立连接时)然后ephemeral znode被破坏,我们必须创建一个新的客户端连接(实例化一个新ZooKeeper 实例),如果我们想要的话访问整体,然后重新建立一切,即节点创建和添加手表.
所以我认为在你的情况下这也可能适用,如理解Kazoo States Section中所述
当连接转换为LOST时,Zookeeper将删除已创建的任何短暂节点.这会影响创建短暂节点的所有配方,例如锁定配方.在状态再次转换为CONNECTED之后,需要重新获取锁定.会话过期或停止客户端连接时会发生此转换.
希望此信息可以帮助您了解各种状态以及何时再次重新配置所有内容.
| 归档时间: |
|
| 查看次数: |
5498 次 |
| 最近记录: |