Ich benutze dieses Juwel: https://github.com/zk-ruby/zk
für den Anschluss an zookeeper, und get
und set
Befehle funktionieren ordnungsgemäß.zookeeper watcher in ruby
Ich habe versucht, einen Beobachter-Client mit der Probe zookeeper Client, der mit dem Server-Build kommt, und alles funktioniert gut dort. Ich kann einen Watcher hinzufügen, und wenn ich einen Znode von einem anderen Client aktualisiere, wird der Client benachrichtigt.
Aber ich möchte einen Beobachter in Ruby-Code integrieren, ich bekomme keine Ereignisse, wenn Daten auf dem Knoten geändert werden.
Dies ist eine Beispielklasse:
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
ich von hier einen Code nahm https://github.com/airbnb/synapse/blob/master/lib/synapse/service_watcher/zookeeper.rb
dafür, aber nicht helfen.
Ich versuchte es auf einem Schienenprojekt, versucht, auf thin
und passenger
laufen, obwohl ich nicht sehe, wie es helfen würde.
Ich sehe Eventmaschine auch nicht als eine Abhängigkeit für dieses Juwel, so dass ich nicht wirklich weiß, wie Rückrufe erhalten würden.
https://github.com/zk-ruby/zk/blob/5854b33ac0d584dacba03a63a5db917620d92a00/docs/examples/events_01.rb Dies legt nahe, auch etwas Ähnliches. – neeraj
Es muss mit dem zookeeper Client-Protokoll zu tun haben. Um eine Überwachungsbenachrichtigung vom Server zu erhalten, müssen Sie einen Befehl an den Server senden, der einen Pfad enthält, der den überwachten Pfad enthält. Ich denke, es ist ein gängiger Anwendungsfall, um eine Mathematik zu erhalten oder anzugeben, und Sie möchten benachrichtigt bleiben, wenn sich das ändert, also stellen Sie gleichzeitig eine Uhr ein. Es eliminiert mindestens 1 Umlauf zum Server. – Kevin