gpt4 book ai didi

python - 当 zookeeper 的状态自动改变时,Watches 和 Ephemeral 节点不工作?

转载 作者:太空狗 更新时间:2023-10-29 18:27:59 24 4
gpt4 key购买 nike

我有一个非常奇怪的 Python 案例 Kazoo图书馆。我在下面的代码中所做的是 -

一旦我使用 kazoo 库连接到 Zookeeper,我就创建了一个临时节点,然后监视其他节点,然后我继续在无限循环中永远运行该程序。我还添加了一个监听器Zookeeper 也将监视状态。

一切对我来说都工作得很好,临时节点已经启动,在我的 znode 上观看也工作正常......

有时,由于连接中断或掉线,我会看到非常奇怪的行为。正如我上面提到的,我已经向 zookeeper 添加了一个监听器,它将监视状态,并且我还有一个打印语句。我总是看到,这些打印语句被打印为 Lost SuspendedConnected,我相信是因为连接中断,之后我的临时节点死了,我在 znode 上的 watch 也不能正常工作。

下面是我的代码,它会永远运行 -

#!/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 状态更改为 LostSuspendedConnected 时。我想通过再次创建我的临时节点来启动它(如果这是正确的方法)并且我在 znode 上的 watch 也一直在工作。

因为我将永远运行我的程序,所以无论出于何种原因,如果 Zookeeper 状态由于连接中断而发生变化并且它会自动重新连接,那么我需要确保我的临时节点也已启动并且我的 watches 在 znode 上也会自动开始工作..

目前,如果状态自动更改,我的 ephemeral 会死掉, watch 也不会工作。

知道如何解决这个问题吗?

最佳答案

事情是这样的,当连接状态发生变化时,你的观察者也会被触发。有一个事件被提供给观察者。它可以类似于 nodeDataChanged 或 nodeChildrenChanged。但是,由于在 session 终止或存在连接问题时不可能收到您感兴趣的事件的通知,因此您的观察者将收到这些 session 问题的通知。我认为此事件的事件类型是“无”。

来自 http://zookeeper.apache.org/doc/trunk/zookeeperProgrammers.html#ch_zkWatches

关于 watch 的注意事项

  • watch 是一次性触发器;如果你得到一个 watch 事件并且你想要要获得 future 更改的通知,您必须设置另一只 watch 。
  • 因为 watch 是一次性触发器,并且之间存在延迟获取事件并发送新请求以获取您无法获取的 watch 可靠地查看 ZooKeeper 中节点发生的每个更改。是准备处理 znode 多次更改的情况在获取事件和再次设置 watch 之间。 (你不可以关心,但至少意识到它可能会发生。)
  • 监视对象或函数/上下文对只会被触发一次对于给定的通知。例如,如果同一个监视对象是为同一个文件注册了一个 exists 和 getData 调用,并且然后删除该文件,将只调用监视对象一次带有文件的删除通知。
  • 当您与服务器断开连接时(例如,当服务器失败),您将无法获得任何 watch ,直到连接成功重新建立。出于这个原因, session 事件被发送到所有杰出的 watch 管理员。使用 session 事件进入保险箱模式:断开连接时您不会收到事件,因此您的流程应在该模式下保守行事。

所以,长话短说,您的观察者应该打开事件以查看它是什么类型,并通过进入某种故障转移模式来适本地响应 None 类型。

我通常做的是我的 Watcher 对象也是 listeners。当重新连接发生时,我通过重置 watch 来响应,确保检查是否存在适当的 znode 并在必要时创建它们。

关于python - 当 zookeeper 的状态自动改变时,Watches 和 Ephemeral 节点不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20171418/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com