当前位置:  开发笔记 > 后端 > 正文

Redis pub/sub on rails

如何解决《Redispub/subonrails》经验,为你挑选了1个好方法。

关注Redis Pub/Sub

这工作正常,我可以使用任何类发布消息

$redis.publish 'channel', { object: @object.id }

使用redis-cli > MONITOR,我可以验证此请求是否已正确发布

[0 127.0.0.1:64192] "publish" "channel" "{:object=>\"5331d541f4eec77185000003\" }"

当我在其他类(监听器类)中向该通道添加订户时,问题就开始了,如下所示

class OtherClass
  $redis.subscribe('channel') do |payload|
    p payload
  end
end

in redis-cli > MONITOR,还表明侦听器已正确订阅

[0 127.0.0.1:52930] "subscribe" "channel"

问题是,当我将订阅者监听器类添加到相同的rails应用程序时...它停止工作导致OtherClass侦听redis服务器并停止执行任何其他代码...它只是坐在那里听.

那么有没有办法在相同的rails应用程序上使用redis创建消息传递总线...以便从某些类或服务对象发布事件,并且有特定通道的侦听器在后台接收事件时采取行动.

我知道我可能会使用sidekiq或任何其他背景工作者来完成这项工作......但过了一段时间后,后台工作人员变得混乱且无法维护.



1> rossta..:

实现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

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有