当前位置: 首页 > 知识库问答 >
问题:

铁路上的Redis酒吧/酒吧

朱丰
2023-03-14

跟随Redis酒吧/酒吧

这很好用,我可以使用

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

使用redis cli

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

当我在另一个类(listener类)中将订户块添加到该通道时,问题就开始了,如下所示

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

在<代码>redis-cli中

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

问题是,当我将subscriber listener类添加到同一个rails应用程序时。。。它停止工作,因为OtherClass侦听redis服务器并停止执行任何其他代码。。。它只是坐在那里听着。

那么,有没有办法在同一个rails应用程序上使用redis制作消息总线呢。。。因此,事件是从某些类或服务对象发布的,并且有特定通道的侦听器在后台接收事件时进行操作。

我知道我可能会使用sidekiq或任何其他背景工作者来做这项工作。。。但过了一段时间,背景工作人员变得杂乱无章,无法维护。

共有1个答案

东方飞捷
2023-03-14

Redis#subscribe的实现是一个循环,它将控制当前线程以监听事件。这意味着,当按照您所示的方式将订阅放到Rails类的上下文中时,启动过程将停止。

您可以尝试将调用包装到线程中,但这种方法实际上会在每次将此类加载到新进程(如rails控制台或多个unicorns)时创建一个新订阅。此外,您还必须小心共享状态和其他线程问题。这可能不是你想要的。

您最好启动一个不同的进程,加载rails环境并订阅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
 类似资料:
  • 我正在使用redis pub/sub 编写两个或多个节点进程之间的p2p通信,使用的是lib。 我将发布不同类型的消息,如: 您好:通知其他订阅者新进程已连接 我不知道是否它是更好的为redis订阅许多通道(一个消息类型)或创建一个单一的通道,并发送一个属性,定义消息的类型,如: 提前谢谢

  • 条形图用于绘制基于区域的图表。 在本节中,我们将讨论不同类型的条形图表。 Sr.No. 图表类型和描述 1 基本酒吧 基本条形图。 2 堆积吧 条形图有条形堆叠在一起。 3 负堆积区域 条形图与负堆栈。

  • 我有问题得到一个图例显示在条形图,我已经创建了使用chartjs。留档谈到了一个图例模板,但是我似乎找不到一个如何在图中实现它的好例子。下面是我用来生成图形的代码。

  • 我有一个熊猫数据框,它有两列。 我需要“伯爵”专栏下令的情节。

  • 我使用和库。是否有可能以这样的方式更改条形图的颜色方案,即对应于较高计数的条形图具有较深的红色,而对应于较低计数的条形图具有浅红色?所以,某种热图应用于条形图。我怎么做?目前,我的计数图中有随机颜色。 更新: 我试过这个: 但较暗的颜色并不对应较高的计数。看起来颜色是使用预定义的调色板随机分配给条的。

  • 顺序对于创建发布服务器和订阅服务器是否重要?如果我有应用程序A,它充当发布者和几个客户端应用程序x1-xn(作为应用程序A的订阅者),我是否可以首先启动子应用程序,将它们注册为订阅者,然后启动应用程序A?这是否可行,或者我需要启动应用程序A?