ruby-on-rails - Rails 应用程序 : Reconnect juggernaut redis after forking?

标签 ruby-on-rails redis spawn juggernaut

我正在开发一个使用 Juggernaut 的 Rails 应用程序定期向客户端推送数据。我使用 Controller Action 来开始推送;但由于推送通常是一个漫长的过程(10 分钟或更长时间),我正在使用 spawn 来 fork 任务。例如:

def start_pushing
  spawn_block(:argv => "juggernaut-pushing") do
    for x in y
      Juggernaut.publish(stuff in here)
      sleep(30) # delay before publishing next item
    end
  end
end

问题是当我点击 start_pushing 操作时,我在日志文件中发现了这个错误:

spawn> Exception in child[27898] - Redis::InheritedError: Tried to use a connection from a child process without reconnecting. You need to reconnect to Redis after forking.

所以我在 spawn_block 中添加了以下内容,希望它能解决问题:

    require 'redis'
    $redis.client.disconnect
    $redis = Redis.new(:host => 'localhost', :port => 6379)

它似乎没有修复它,尽管在我添加它以重置 $redis 之前,该操作一直间歇性地工作。我在想,也许重置 $redis 没有做任何事情; Juggernaut 仍在访问旧连接。这看起来有可能吗?我如何确保 Juggernaut 使用新的 Redis 连接?

如果对我所描述的内容有任何疑问,请告诉我。感谢您的帮助,因为我现在被困住了。

最佳答案

问题在于使用全局变量(以 $ 开头的变量)并使用 Passenger。所有全局变量在所有乘客进程中共享。 Redis 有某种检查以确保 redis 调用的进程 ID 与连接的进程 ID 相同。因此,如果 redis 是使用 passenger worker 1 连接的,但随后 worker 2 使用它,则会出现此错误。

有关详细信息,请参阅 Redis::Client 类的方法 connect 和 ensure_connected。

this issue 中解释了解决方案. 基本上,他们建议您喜欢 memcache 作为 explained here .

简而言之,在您的 config/environement.rb 中,添加以下内容:

if defined?(PhusionPassenger)
    PhusionPassenger.on_event(:starting_worker_process) do |forked|
        if forked
            # We're in smart spawning mode.
            $redis.reconnect
        else
            # We're in conservative spawning mode. We don't need to do anything.
        end
    end
end

关于ruby-on-rails - Rails 应用程序 : Reconnect juggernaut redis after forking?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11262067/

相关文章:

ruby-on-rails - Rails Paperclip gem 参数数量错误错误

javascript - 使用 casperjs 遇到 TypeError

javascript - Node.js 中的 ENOMEM 由高虚拟内存使用率引起

mysql - 从redis切换到Mysql。好主意?

Redis 集群实例比独立实例消耗更多内存?

javascript - Nodejs如何等待子进程退出或允许其响应

ruby-on-rails - 你为 Rails 推荐哪个状态机插件?

javascript - 从 JavaScript 生成的 Cookie 中解析 Rails 中的 JSON 字符串

ruby-on-rails - Rails Postgres 过滤 jsonb 数组中的 jsonb 对象

php - 在 PHP 中注销的决定