【问题标题】:zookeeper watcher in rubyruby 中的 zookeeper 观察者
【发布时间】:2016-06-13 14:37:49
【问题描述】:

我正在使用这个 gem:https://github.com/zk-ruby/zk 连接到 zookeeper,getset 命令工作正常。

我尝试使用随服务器构建一起提供的示例 zookeeper 客户端添加观察者客户端,并且一切正常。我可以添加一个观察者,当我从另一个客户端更新一些 znode 时,客户端会收到通知。

但我希望在 ruby​​ 代码中集成一个观察者,当节点上的数据发生更改时,我没有收到任何事件。

这是一个示例类:

class ZkConnect

  attr_accessor :z, :sub, :k
  include Singleton

  @z = nil
  @sub = nil
  @watcher = nil
  @callback = nil
  @watcher = nil

  def initialize
    initialize_conns
  end

  def initialize_conns
    @z = ZK.new("localhost:2181")
    Rails.logger.info @z.inspect
    # Rails.logger.info z.get_children(:path => "/system/production")
    # Rails.logger.info z.get(:path => "/system/production")[:data]

    # @sub = @z.register("/mypath") do |event, zookeeper_client|
    #   Rails.logger.info "got an event"
    #   Rails.logger.info "got an event on: #{event.inspect} #{zookeeper_client.inspect}"
    # end
    # Rails.logger.info @sub.inspect
    w = watch
    Rails.logger.info "dsmcldsm: #{w.inspect}"
  end

  # def watcher_callback
  #   @callback ||= Proc.new do |event|
  #     Rails.logger.info "dcbskcn : #{event.inspect}"
  #     # Set new watcher
  #     watch
  #     # Rediscover
  #     # discover
  #   end
  #   Rails.logger.info "nckdj cudsnciu sdcn: #{@callback.inspect}"
  #   return @callback
  # end

  def watch
    # return if @z.nil?
    Rails.logger.info "synapse: setting watch at "

    # @watcher = @z.register("/mypath", &watcher_callback)
    @watcher = @z.register("/mypath") do |event|
      Rails.logger.info "dcbskcn : #{event.inspect}"
      puts "dcbskcn : #{event.inspect}"
      watch
    end
    Rails.logger.info "cudsnciu: #{@watcher.inspect}"
    return @watcher

    # Verify that we actually set up the watcher.
    # unless @zk.exists?(@discovery['path'], :watch => true)
    #   log.error "synapse: zookeeper watcher path #{@discovery['path']} does not exist!"
    #   zk_cleanup
    # end
    # log.debug "synapse: set watch at #{@discovery['path']}"
  end
end

为此,我从 https://github.com/airbnb/synapse/blob/master/lib/synapse/service_watcher/zookeeper.rb 获取了一些代码,但没有帮助。

我在一个 Rails 项目上尝试过,尝试在 thinpassenger 上运行,但我看不出它会有什么帮助。

我也不认为 eventmachine 是这个 gem 的依赖项,所以我真的不知道如何接收回调。

【问题讨论】:

    标签: ruby-on-rails ruby apache-zookeeper


    【解决方案1】:

    我阅读了变更日志并决定在注册观察者后放置@z.stat("/mypath", :watch => true)。它开始工作了。不知道为什么。

    【讨论】:

    • github.com/zk-ruby/zk/blob/… 这也暗示了类似的事情。
    • 它必须使用 zookeeper 客户端协议。为了从服务器接收监视通知,您必须向服务器发送命令以获取包含要监视的路径的路径。我想这是一个足够常见的用例来获取或统计数学,并且您希望在它发生变化时保持通知,因此同时设置一个手表。它消除了至少 1 次到服务器的往返行程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    相关资源
    最近更新 更多