gpt4 book ai didi

ruby-on-rails - 如何在 Rails 应用程序中启动 pubsub 订阅者

转载 作者:IT王子 更新时间:2023-10-29 05:57:27 24 4
gpt4 key购买 nike

我有一个 Rails(网络)应用程序,我也需要添加一个(redis)发布/订阅订阅者。

下面是我需要启动的 PubsubSubscriber 类,然后应用程序启动。

redis 连接是在 resque.rb 初始化文件中创建的。连接后我尝试了 PubsubSubscriber.new,但是当我尝试启动 Rails 服务器时它卡在:

=> Booting Thin
=> Rails 3.2.13 application starting in development on http://0.0.0.0:5000
=> Call with -d to detach
=> Ctrl-C to shutdown server

与服务器成功启动时相反:

=> Booting Thin
=> Rails 3.2.13 application starting in development on http://0.0.0.0:5000
=> Call with -d to detach
=> Ctrl-C to shutdown server
>> Thin web server (v1.5.1 codename Straight Razor)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:5000, CTRL+C to stop

知道为什么当我尝试在初始化程序中实例化 PubsubSubscriber 类时服务器挂起吗?有没有更好的起点?


# example modified from https://github.com/redis/redis-rb/blob/master/examples/pubsub.rb
class PubsubSubscriber

def initialize
$redis.psubscribe( :channel_one ) do |on|

on.psubscribe do |event, total|
end

on.pmessage do |pattern, event, message|
# message received, kick off some workers
end

on.punsubscribe do |event, total|
end

end

end
end

最佳答案

您遇到的一个问题是当您在初始化程序中时 EventMachine 尚未准备好。因此,将您的初始化包装在 EM.next_tick 中将延迟您的代码,直到 EventMachine 准备就绪:

EM.next_tick { ... EventMachine code here ... }

当我尝试这样做时,我的服务器一直启动......然后在调用 $redis.psubscribe 时被阻止。

但是,切换到 em-hiredis工作:

# config/initializers/redis_pubsub.rb
EM.next_tick do
$emredis = EM::Hiredis.connect(uri)

$emredis.pubsub.subscribe('channelone') do |message|
Rails.logger.debug message
end
end

这是因为标准的 redis gem 没有通过 EventMachine 接口(interface)监听事件——它只是创建一个到你的 redis 服务器的连接,然后阻止其他一切。

为了利用 EM,您需要建立一个简单的连接,形式如下:

class RedisConnection
# connect to redis
def connect(host, port)
EventMachine.connect host, port, self
end

def post_init
# send subscribe channel_one to redis
end

def receive_data(data)
# channel_one messages will arrive here
end
end

我在这个要点中有一个工作示例:https://gist.github.com/wheeyls/5647713

em-hiredis是使用这个接口(interface)的redis客户端。

关于ruby-on-rails - 如何在 Rails 应用程序中启动 pubsub 订阅者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16701040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com