我对 Python Kazoo库有一个非常奇怪的案例。我在下面的代码中所做的是 -
一旦我使用 kazoo 库连接到 Zookeeper,我就创建了一个临时节点,然后监视其他节点,然后我继续在无限循环中永远运行程序。我还向 Zookeeper 添加了一个监听器这也将监视状态。
一切对我来说都运行良好,临时节点已启动,在我的 znode 上观看也运行良好......
有时,由于连接中断或断开,我会看到非常奇怪的行为。正如我上面提到的,我已经向 zookeeper 添加了一个监听器,它将监视状态,我也有一个 print 语句。我总是看到,那些 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)
有没有办法克服这个问题?每当我的 Zookeeper 状态更改为Lost
orSuspended
或时,我都希望这样做Connected
。我想通过再次创建它来启动我的临时节点(如果这是正确的方法),并且我在 znode 上的手表也能正常工作。
因为我将永远运行我的程序,所以无论出于何种原因,如果 Zookeeper 状态由于连接中断而发生变化并且它会自动重新连接,那么我需要确保我的临时节点也已启动并且我在 znode 上的手表也开始工作自动地..
目前,如果状态自动更改,我的短暂死机和手表也不起作用..
知道如何克服这个问题吗?