1
我使用這個寶石:https://github.com/zk-ruby/zk
連接到動物園管理員,和get
和set
命令工作正常。紅寶石動物園看守人
我已經嘗試添加一個使用示例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項目上,試過在thin
和passenger
上運行,雖然我看不出它會有什麼幫助。
我也沒有看到eventmachine作爲這個寶石的依賴,所以我真的不知道如何收到回調。
https://github.com/zk-ruby/zk/blob/5854b33ac0d584dacba03a63a5db917620d92a00/docs/examples/events_01.rb 這也表明類似的東西。 – neeraj
它必須做w /動物園管理員客戶端協議。爲了從服務器接收監視通知,您必須向服務器發送包含要觀看路徑的路徑的命令。我想這是一個常見的用例來獲取或統計數學,並且如果它發生變化,您希望保持通知,所以請在同一時間設置一個手錶。它至少消除了一次到服務器的往返行程。 – Kevin