jjzjj

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

coder 2023-08-17 原文

我有一个非常奇怪的 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/

有关python - 当 zookeeper 的状态自动改变时,Watches 和 Ephemeral 节点不工作?的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  5. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  6. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  7. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  8. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  9. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  10. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

随机推荐