Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Redis Pub/Sub auf Schienen

Die Implementierung von Redis#subscribe ist eine Schleife, die die Kontrolle über den aktuellen Thread übernimmt, um Ereignisse abzuhören. Dies bedeutet, dass der Boot-Prozess angehalten wird, wenn ein Abonnement wie gezeigt in den Kontext einer Rails-Klasse verschoben wird.

Sie könnten versuchen, den Aufruf in einen Thread zu verpacken, aber dieser Ansatz würde jedes Mal, wenn diese Klasse in einem neuen Prozess geladen wird, buchstäblich ein neues Abonnement erstellen, z. B. eine Rails-Konsole oder mehrere Einhörner. Außerdem müssten Sie auf den gemeinsamen Zustand und andere Threading-Probleme achten. Das ist wahrscheinlich nicht das, was Sie wollen.

Am besten starten Sie einen anderen Prozess, der die Rails-Umgebung lädt und Redis abonniert, getrennt von den Prozessen, die Webanforderungen bedienen. Es könnte eine Rake-Aufgabe wie die folgende sein:

namespace :subscribe do
  task :redis => :environment do
    $redis.subscribe("bravo") do |on|
      on.message do |channel, message|
        Rails.logger.info("Broadcast on channel #{channel}: #{message}")
        OtherClass.some_method # yada yada
      end
    end
  end
end