Redis
 sql >> Database >  >> NoSQL >> Redis

Pub/sub Redis su rotaie

L'implementazione di Redis#subscribe è un ciclo che assumerà il controllo del thread corrente per ascoltare gli eventi. Ciò significa che il processo di avvio viene interrotto quando si rilascia una sottoscrizione nel contesto di una classe Rails nel modo in cui è stato mostrato.

Potresti provare a racchiudere la chiamata in un thread, ma questo approccio creerebbe letteralmente una nuova sottoscrizione ogni volta che questa classe viene caricata in un nuovo processo, come una console rails o più unicorni. Inoltre, dovresti stare attento allo stato condiviso e ad altri problemi di threading. Probabilmente non è quello che vuoi.

È meglio avviare un processo diverso che carichi l'ambiente rails e si abboni a redis separatamente dai processi che servono le richieste web. Potrebbe essere un'attività di rake come la seguente:

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