Выполнить восстановление в фоновом режиме

У меня есть рабочее приложение rails с системой очереди восстановления, которое работает очень хорошо. Однако у меня нет хорошего способа демонизировать спасателей.

Я могу запустить их, выполнив rake resque: work QUEUE = "*", но я думаю, что не в том, что ваши рабочие должны работать на переднем плане. Похоже, что почему-то этим вопросом никто не занимается. На официальной странице resque github можно сделать что-то вроде этого:

PIDFILE=./resque.pid BACKGROUND=yes QUEUE="*" rake resque:work

ну, по крайней мере, здесь это не влезает в фон.

22
задан Markus 13 November 2011 в 19:31
поделиться

1 ответ

+1 для Resque-Pool - это действительно круто. Мы используем его в сочетании с Богом, чтобы быть уверенным, что оно всегда доступно.

# Resque
God.watch do |w|

  w.dir = RAILS_ROOT

  w.name = "resque-pool"
  w.interval = 30.seconds
  w.start = "cd #{RAILS_ROOT} && sudo -u www-data sh -c 'umask 002 && resque-pool -d -E #{RAILS_ENV}'"
  w.start_grace = 20.seconds
  w.pid_file = "#{RAILS_ROOT}/tmp/pids/resque-pool.pid"

  w.behavior(:clean_pid_file)

  # restart if memory gets too high
  #w.transition(:up, :restart) do |on|
  #  on.condition(:memory_usage) do |c|
  #    c.above = 350.megabytes
  #    c.times = 2
  #  end
  #end

  # determine the state on startup
  w.transition(:init, { true => :up, false => :start }) do |on|
    on.condition(:process_running) do |c|
      c.running = true
    end
  end

  # determine when process has finished starting
  w.transition([:start, :restart], :up) do |on|
    on.condition(:process_running) do |c|
      c.running = true
      c.interval = 5.seconds
    end

    # failsafe
    on.condition(:tries) do |c|
      c.times = 5
      c.transition = :start
      c.interval = 5.seconds
    end
  end

  # start if process is not running
  w.transition(:up, :start) do |on|
    on.condition(:process_running) do |c|
      c.running = false
    end
  end
end

Это дает вам действительно элегантный способ перезагрузить код в ваших работниках, не прерывая работу, - просто kill -2 ваш пул (-ы) resque при развертывании. Бесполезные работники немедленно умрут, занятые работники умрут, когда они закончат свою текущую работу, и Бог возобновит объединение ресурсов с работниками, использующими ваш новый код.

Это наши задачи Resque для Capistrano:

namespace :resque do

  desc "Starts resque-pool daemon."
  task :start, :roles => :app, :only => { :jobs => true } do
    run "cd #{current_path};resque_pool -d -e #{rails_env} start"
  end

  desc "Sends INT to resque-pool daemon to close master, letting workers finish their jobs."
  task :stop, :roles => :app, :only => { :jobs => true } do
    pid = "#{current_path}/tmp/pids/resque-pool.pid"
    sudo "kill -2 `cat #{pid}`"
  end

  desc "Restart resque workers - actually uses resque.stop and lets God restart in due course."
  task :restart, :roles => :app, :only => { :jobs => true } do
    stop # let God restart.
  end

  desc "List all resque processes."
  task :ps, :roles => :app, :only => { :jobs => true } do
    run 'ps -ef f | grep -E "[r]esque-(pool|[0-9])"'
  end

  desc "List all resque pool processes."
  task :psm, :roles => :app, :only => { :jobs => true } do
    run 'ps -ef f | grep -E "[r]esque-pool"'
  end

end

Вам может понадобиться переподключить любые соединения с БД, когда работники вилок в resque-pool - проверьте документы.

15
ответ дан 29 November 2019 в 04:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: