2016-06-09 14 views
1

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.

Antwort

1

Ich lese changelog und entschied mich für eine @z.stat("/mypath", :watch => true) nach Registrierung des Watcher. Und es fing an zu arbeiten. Keine Ahnung warum.

+0

https://github.com/zk-ruby/zk/blob/5854b33ac0d584dacba03a63a5db917620d92a00/docs/examples/events_01.rb Dies legt nahe, auch etwas Ähnliches. – neeraj

+0

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