【发布时间】:2013-12-08 21:37:20
【问题描述】:
我对 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 或 Suspended 或 Connected 时,我都希望这样做。我想通过再次创建它来启动我的临时节点(如果这是正确的方法),并且我在 znode 上的手表也可以正常工作。
因为我将永远运行我的程序,所以无论出于何种原因,如果 Zookeeper 状态由于连接中断而发生变化并且它会自动重新连接,那么我需要确保我的临时节点也已启动并且我在 znode 上的手表也开始自动工作..
目前,如果状态自动更改,我的短暂死机和手表也不起作用..
知道如何解决这个问题吗?
【问题讨论】:
-
这很奇怪,但
Lost-> 'Suspended' 转换似乎无效。您看到Lost->Suspended->Connected的转换顺序是否正确? -
你不能在你知道你已经连接或重新连接的
my_listener的分支中创建临时节点吗?听起来您希望每次连接/重新连接时都创建临时节点,而不仅仅是在初始连接时 - 但您的代码只执行后者。
标签: python apache-zookeeper watch kazoo