我对Python Kazoo库有一个非常奇怪的例子。我在下面的代码中所做的是-
一旦我使用kazoo库连接到ZooKeeper,我就会创建一个短暂的节点,然后在其他节点上保持监视,然后我继续在无限循环中永远运行程序。.我还为ZooKeeper添加了一个侦听器,它也将监控状态。
一切都工作得很好,我,短暂的节点是起来,手表上我的z节点也工作得很好...
有时候,我看到非常奇怪的行为,因为连接中断或下降。正如我上面提到的,我已经添加了一个监听器到zooManager,它将监控状态,我也有一个打印语句...我总是看到,那些打印语句被打印出来作为丢失
,暂停
,连接
,我相信是因为连接中断,之后我的短暂节点死掉,我在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状态变为丢失
或暂停
或连接
时,我都希望这样。我希望通过再次创建临时节点(如果这是正确的方法)来启动临时节点,并且我在znode上的手表也能一直正常工作。
因为我将永远运行我的程序,所以无论出于什么原因,如果ZooManager状态因连接中断而改变,并且它会自动重新连接,那么我需要确保我的短暂节点也已启动,并且我在znode上的手表也开始自动工作...
目前,如果状态自动改变,我的短暂死亡和手表也不起作用...
知道如何克服这个问题吗?
我对Python一无所知,但我想我会强调一下关于ZNodes
ZNodes
有两种类型:短暂的
或持久的
persistent znode
一旦创建,只有在客户端明确删除时才会被删除(不一定是创建它的客户端)
在Java版本(Java API)中,如果客户机连接到多个服务器,并且如果它与连接的服务器断开连接,那么我们将使用KeeperState触发事件。断开连接
,但它会重新尝试并连接到另一台服务器,在这段时间内,短暂的znode
和所有手表都完好无损,即它们不会被销毁,而是一次与保持状态的事件。Expired
被调用(当客户端无法在指定时间内与任何服务器建立连接时),然后短暂的znode
被破坏,如果我们想访问集合,然后重新建立一切,即节点创建和html" target="_blank">添加手表,我们必须创建一个新的客户端连接(实例化一个新的ZooKeeper
实例)。
所以我认为在你们的情况下,这也可能是适用的,正如理解卡祖州一节所提到的
当连接转换为丢失时,Zookeeper将删除所有已创建的短暂节点。这会影响所有创建短暂节点的配方,例如锁配方。在状态转换为“再次连接”后,需要重新获取锁。当会话过期或停止客户端连接时,会发生此转换。
希望这些信息能帮助你了解各种状态,以及何时重新配置一切。
事情是这样的,当连接状态发生变化时,你的观察者也会被触发。有一个事件是给观察者的。它可以是nodeDataChanged或nodeChildrenChanged。但是,由于当会话终止或存在连接问题时,无法通知您感兴趣的事件,因此您的观察者将收到这些会话问题的通知。我认为这项活动的类型是“无”
从…起http://zookeeper.apache.org/doc/trunk/zookeeperProgrammers.html#ch_zkWatches
关于手表要记住的事情
因此,长话短说,您的观察者应该打开事件,看看它是什么类型的,并通过进入某种故障切换模式来适当地响应None类型。
我通常做的是我的观察者对象也是监听器。当重新连接发生时,我会重置手表,确保检查是否存在合适的Z节点,并在必要时创建它们。
本文向大家介绍对比Oracle临时表和SQL Server临时表的不同点,包括了对比Oracle临时表和SQL Server临时表的不同点的使用技巧和注意事项,需要的朋友参考一下 Oracle数据库创建临时表的过程以及和SQL Server临时表的不同点的对比的相关知识是本文我们主要要介绍的内容,接下来就让我们一起来了解一下这部分内容吧,希望能够对您有所帮助。 1.简介 Oracle数据库除了可以
我有表“Giorno”,我想改变它,但没有显示列,我甚至不能添加一个新列,因为现有的列也没有显示,下面的截图: 我还试图创建一个新表,但它出现了相同的bug。所以我不能添加新列。
我是reactjs的新手,我不知道如何从父组件中更改子组件的状态。下面是代码 每当对父组件中的执行时,我希望子组件接收。 有什么建议吗?
问题内容: 我做了一个小实验:http : //codepen.io/hawkphil/pen/NqMomm?editors=101 这是我的状态流(单击按钮): 在每个状态变化,我在出了 但是,你可以在看线,奇怪的事情发生了。我从“后退”按钮获得的“思维”,它显示为先前的状态()。这是不对的,对吧?它应该显示为以前的状态,因为我必须通过单击按钮来 手动*状态。我还显示了(line )中的值,以防
问题内容: 我有一个这样的状态,我正在设置和标记如下: 我有一个列表,其中包含状态为类的项目: 在这里,如何更改特定div的类名? 问题答案: 以下是我相信您正在尝试做的一个功能齐全的示例(带有功能性摘录)。 根据您的问题,您似乎正在为所有元素修改1属性。这就是为什么当您单击一个时,它们全部都被更改了。 尤其要注意,状态跟踪 哪个 元素处于活动状态的索引。当被点击时,它告诉它的索引,更新,随后相应
我正在玩一个链接列表类项目的指针,我不知道如何创建到新节点的链接。我有一个类,它包含像这样的方法来操作数据结构。我希望这些节点是从csv文件中读取的出价。 当我从CSV加载所有数据时,我想 创建一个新的出价 将新的出价传递给函数 设置Bid对象的nextBid指针,并更新链接列表的尾部 我将不胜感激为每个出价对象创建新地址的任何指针,因为现在尾节点只'记得'第一个出价的地址。 我复制了下面的代码,