Redis pub / sub on rails
关注Redis Pub / Sub
这工作正常,我可以使用任何类发布消息
$redis.publish 'channel', { object: @object.id }
使用redis-cli > MONITOR
,我可以validation此请求是否已正确发布
[0 127.0.0.1:64192] "publish" "channel" "{:object=>\"5331d541f4eec77185000003\" }"
当我在其他类(监听器类)中向该通道添加订户块时,问题就开始了,如下所示
class OtherClass $redis.subscribe('channel') do |payload| p payload end end
在redis-cli > MONITOR
,还显示侦听器已正确订阅
[0 127.0.0.1:52930] "subscribe" "channel"
问题是,当我将订阅者监听器类添加到相同的rails应用程序时……它停止工作,因为OtherClass
监听redis服务器并停止执行任何其他代码……它只是坐在那里听。
那么有没有办法在相同的rails应用程序上使用redis创建消息传递总线…以便从某些类或服务对象发布事件,并且有特定通道的侦听器在后台接收事件时采取行动。
我知道我可能会使用sidekiq或任何其他背景工作者来完成这项工作……但过了一段时间后,后台工作人员变得混乱而且无法维护。
Redis#subscribe
的实现是一个循环 ,它将控制当前线程以侦听事件。 这意味着在以您显示的方式将订阅放入Rails类的上下文时,将停止引导过程。
您可以尝试在一个线程中包装调用,但是每次在新进程中加载此类时,这种方法都会创建一个新的订阅,例如rails控制台或多个独角兽。 另外,您必须小心共享状态和其他线程问题。 这可能不是你想要的。
您最好启动一个加载rails环境的不同进程,并与提供Web请求的进程分开订阅redis。 它可能是如下的rake任务:
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
- 如何使用ActionController :: Live以及Resque + Redis(用于聊天应用程序)
- 与Ruby,Redis和Ohm的多对多关系
- Redis正在寻找env redis url变量,不知道在哪里放置env变量坏URI(不是URI?):( URI :: InvalidURIError)
- 在部署到Heroku时,为什么Travis无法连接使用Redis cache_store?
- 如何在启动时自动创建resque worker?
- 在sidekiq上配置redis auth
- 将redis部署到heroku无法连接
- 简单使用EM :: Synchrony#sync导致’根光纤’FiberError – 我的错?
- 使用Heroku在RedisToGo上使用Resque,Resque Server