2016-08-25 8 views
-1

Ich habe eine globale Variable in einem meiner Rails-Initialisierer config/initializers/globals.rb. Diese Variable ist einfach eine Liste, die auf die Mitglieder eines Redis-Sets gesetzt ist.Wie aktualisiert man eine globale Rails-Variable in einem Job?

$listOfBannedDomains = $redis.smembers("banned_domains") 

Der Redis Satz wird einmal in eine Weile aktualisiert. Wie kann ich $ listOfBannedDomains mit den Redis-Einstellungen alle X Stunden aktualisieren, ohne meine Rails-App neu zu starten?

Beachten Sie, dass ich nicht in Echtzeit vom Redis-Set lesen möchte.

+1

Ich bin neugierig, warum Sie nicht jedes Mal von redisis lesen möchten, wenn auf $ listOfBannedDomains zugegriffen wird? – kiddorails

+0

, weil es potenziell 1 Milliarde Elemente enthalten könnte. –

+0

Eine Antwort unten hinzugefügt, um Ihre Konstante asynchron aktualisieren zu lassen, ohne die Rails zu blockieren. – kiddorails

Antwort

2

Sie können dafür EventMachine verwenden und perioidic timer verwenden, um das asynchron in einer evented-Schleife zu tun. Erstellen

eine neue Schienen initializer - config/initializers/redis_periodic.rb

$listOfBannedDomains = $redis.smembers("banned_domains") 

Thread.new { EM.run } unless EM.reactor_running? # Run the EventMachine reactor if it's not running already in a new thread. 
Signal.trap("INT") { EM.stop } 
Signal.trap("TERM") { EM.stop } 

# Add a periodic timer: 
time_interval = 5 #seconds 
EM.add_perioidic_timer(time_interval) do 
    # Update the constant by re-reading from redis 
    $listOfBannedDomains = $redis.smembers("banned_domains") 
end 

Hinweis: Dies wird nicht blockieren Ihren Haupt-Rails-Thread von Anfragen und ermöglicht es Ihnen, dass der Betrieb nicht asynchron, pro Instanz Schienen. Sie können zusätzliche Bedingungen im Initialisierer hinzufügen, um dies bei Rake (falls erforderlich) auszuschließen.

+0

Dieser EM-Thread wird nicht mehr ausgeführt. Ich nehme an, wenn der Rails-Thread beendet wird? –

+0

Guter Punkt. verpasst das. Code für dasselbe hinzugefügt. Die empfohlene Vorgehensweise besteht darin, Signale einzufangen und EM zu bitten, zu stoppen, wenn der Haupt-Thread beendet wird. – kiddorails

1

Sie können eine Wrapper-Methode zum Zurückgeben dieser Variablen erstellen. Sie können einige zusätzliche Variablen zum Speichern der letzten Aktualisierung hinzufügen. Wenn die Zeit seit der letzten Aktualisierung mehr als X Stunden beträgt, aktualisieren Sie den Wert von Redis.

Verwandte Themen