【问题标题】:How to restart Resque workers automatically when Redis server restartsRedis服务器重启时如何自动重启Resque worker
【发布时间】:2019-02-12 17:41:48
【问题描述】:

我有一个使用 Resque 适配器在后台运行作业的 Rails 应用程序。我注意到有几天我的工人消失了(只是停止),我的工作卡在队列中,每次停止时我都必须重新启动工人。

我使用 ps -e -o pid,command | grep [r]esque 检查并使用在后台启动工作人员 (RAILS_ENV=production PIDFILE=./resque.pid BACKGROUND=yes bundle exec rake resque:workers QUEUE='*' COUNT='12') 2>&1 | tee -a log/resque.log.

然后我使用 /etc/init.d/redis-server stop 停止了 redis-server 并再次检查了工作进程。他们消失了。

这给出了一个理由认为工作进程停止可能是因为 redis 服务器由于某种原因重新启动。

是否有任何 Rails/Ruby 方式解决此问题?我想到的是编写一个简单的 Ruby 代码,它会在一段时间内(比如 5 秒)监视工作进程,并在它们停止时重新启动它们。

更新: 我不想使用Monit、God、eye等工具。它们不可靠。然后我也需要看他们。就像安装上帝来管理 Resque 工人,然后安装 Monit 来监视上帝,......

UPDTAE 这就是我正在使用的,它确实有效。我手动停止了 redis-server,然后再次启动它。该脚本成功启动了worker。

require 'logger'

module Watch

  def self.workers_dead?
   processes = `ps -e -o pid,command | grep [r]esque`
   return true if processes.empty?
   false
  end

  def self.check(time_interval)
   logger = Logger.new('watch.log', 'daily')
   logger.info("Starting watch")

   while(true) do
     if workers_dead?
       logger.warn("Workers are dead")
       restart_workers(logger)
     end
     sleep(time_interval)
   end
  end

  def self.restart_workers(logger)
   logger.info("Restarting workers...")
   `cd /var/www/agts-api && (RAILS_ENV=production PIDFILE=./resque.pid BACKGROUND=yes rake resque:workers QUEUE='*' COUNT='12') 2>&1 | tee -a log/resque.log`
  end

end

Process.daemon(true,true)
pid_file = File.dirname(__FILE__) + "#{__FILE__}.pid"
File.open(pid_file, 'w') { |f| f.write Process.pid }
Watch.check 10

【问题讨论】:

  • 这听起来像是我会使用Monit 的东西
  • 我会检查日志 (log/resque.log) 并查看问题所在,或者您可以在前台启动 resque worker 以进行调试。要运行像 resque 这样的排队系统,我会设置一个进程管理工具,比如其中一个:github.com/kostya/eyedigitalocean.com/community/tutorials/…
  • 可以使用monit、god、eye等进程监控工具,我个人使用eye gem。
  • @siegy22 我有 rake 重定向输出到 log/resque.log 所以,当然,我确实查看了这个文件,希望它对找出工人停止的原因有用。不幸的是,它有几行不知道工人为什么停下来。至于管理工具,我不喜欢这个想法。它们增加了额外的复杂性,并且无法保证它们不会经常崩溃或正常工作。
  • 如果你在 linux 上,我强烈建议使用 systemd,例如,它更容易处理自动启动。在过去的几年里,我一直在使用 eye,它一直对我很有帮助,它非常容易配置,因为它只是普通的 ol' ruby​​

标签: ruby-on-rails ruby redis resque rails-activejob


【解决方案1】:

你可以做的更简单。在前台启动 Resque。当它退出时,重新启动它。没有 pid 文件,没有监控,没有睡眠。

require 'logger'

class Restarter
  def initialize(cmd:, logger: Logger.new(STDOUT))
    @cmd = cmd
    @logger = logger
  end

  def start
    loop do
      @logger.info("Starting #{@cmd}")
      system(@cmd)
      @logger.warn("Process exited: #{@cmd}")
    end
  end
end

restarter = Restarter.new(
  cmd: 'cd /var/www/agts-api && (RAILS_ENV=production rake resque:workers QUEUE='*' COUNT='12') 2>&1 | tee -a log/resque.log',
  logger: Logger.new('watch.log', 'daily')
)
restarter.start

【讨论】:

    【解决方案2】:

    您可以使用monit、god、eye等进程监控工具。这些工具可以在您指定的时间间隔检查resque PID和内存使用情况。如果内存限制超出您指定的预期,您还可以选择重新启动后台进程。就个人而言,我使用眼睛宝石。

    【讨论】:

    • 感谢您的回复。我看过了。它根本没有记录。它有什么作用?如何使用?这个“监控”工具背后的逻辑是什么? Linux 'top' 命令也是一个监控工具,所以不清楚'top' 和这个'tool' 有什么区别。简单的例子不是文件。通常我会避免使用像 Monit 这样的“工具”或怪物,它们通常充满错误。
    • 您打算使用哪种宝石?
    • 我还不会使用任何 gem。但首先我想尝试上帝,然后是眼睛。目前,我发布的脚本运行良好。
    • @UmeshMalhotra 很遗憾,您没有发布如何使用 Eye gem 的详细信息,我会使用它,但没有简单的描述
    猜你喜欢
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 2011-09-24
    • 1970-01-01
    • 2016-07-20
    相关资源
    最近更新 更多