ruby 中的动物园管理员观察员
zookeeper watcher in ruby
我正在使用 gem:https://github.com/zk-ruby/zk
连接到 zookeeper,并且 get
和 set
命令工作正常。
我已经尝试使用服务器构建附带的示例 zookeeper 客户端添加观察程序客户端,并且一切正常。我可以添加一个观察者,当我从另一个客户端更新一些 znode 时,客户端会收到通知。
但我希望在 ruby 代码中集成一个观察者,当节点上的数据更改时我没有收到任何事件。
这是一个示例 class:
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 项目上尝试过,在 thin
和 passenger
上尝试过 运行,但我看不出它有什么帮助。
我也不认为 eventmachine 是这个 gem 的依赖项,所以我真的不知道如何接收回调。
我阅读了变更日志并决定在注册观察者后放置一个 @z.stat("/mypath", :watch => true)
。它开始工作了。不知道为什么。
我正在使用 gem:https://github.com/zk-ruby/zk
连接到 zookeeper,并且 get
和 set
命令工作正常。
我已经尝试使用服务器构建附带的示例 zookeeper 客户端添加观察程序客户端,并且一切正常。我可以添加一个观察者,当我从另一个客户端更新一些 znode 时,客户端会收到通知。
但我希望在 ruby 代码中集成一个观察者,当节点上的数据更改时我没有收到任何事件。
这是一个示例 class:
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 项目上尝试过,在 thin
和 passenger
上尝试过 运行,但我看不出它有什么帮助。
我也不认为 eventmachine 是这个 gem 的依赖项,所以我真的不知道如何接收回调。
我阅读了变更日志并决定在注册观察者后放置一个 @z.stat("/mypath", :watch => true)
。它开始工作了。不知道为什么。