Ответ 1
Я столкнулся с двумя причинами, по которым delayed_job терпит неудачу. Первый - фактические segfaults, когда люди использовали libxml в разветвленных процессах (это появилось в списке рассылки некоторое время назад).
Вторая проблема, связанная с версией демонов 1.1.0, на которую полагается delayed_job, имеет проблему (https://github.com/collectiveidea/delayed_job/issues#issue/81), это можно легко обойти, используя 1.0.10, что и есть мой собственный Gemfile.
Вход
Выполняется запись в delayed_job, поэтому, если рабочий умирает, не печатая ошибку, это обычно потому, что он не бросает исключение (например, Segfault) или что-то внешнее, убивает процесс.
Мониторинг
Я использую bluepill для мониторинга моих замедленных экземпляров заданий, и до сих пор это было очень успешным в обеспечении того, чтобы задания оставались в рабочем состоянии. Шаги для запуска bluepill для приложения довольно просты
Добавьте драгоценный камень bluepill в свой Gemfile:
# Monitoring
gem 'i18n' # Not sure why but it complained I didn't have it
gem 'bluepill'
Я создал файл конфигурации bluepill:
app_home = "/home/mi/production"
workers = 5
Bluepill.application("mi_delayed_job", :log_file => "#{app_home}/shared/log/bluepill.log") do |app|
(0...workers).each do |i|
app.process("delayed_job.#{i}") do |process|
process.working_dir = "#{app_home}/current"
process.start_grace_time = 10.seconds
process.stop_grace_time = 10.seconds
process.restart_grace_time = 10.seconds
process.start_command = "cd #{app_home}/current && RAILS_ENV=production ruby script/delayed_job start -i #{i}"
process.stop_command = "cd #{app_home}/current && RAILS_ENV=production ruby script/delayed_job stop -i #{i}"
process.pid_file = "#{app_home}/shared/pids/delayed_job.#{i}.pid"
process.uid = "mi"
process.gid = "mi"
end
end
end
Затем в моем файле развертывания capistrano я просто добавил:
# Bluepill related tasks
after "deploy:update", "bluepill:quit", "bluepill:start"
namespace :bluepill do
desc "Stop processes that bluepill is monitoring and quit bluepill"
task :quit, :roles => [:app] do
run "cd #{current_path} && bundle exec bluepill --no-privileged stop"
run "cd #{current_path} && bundle exec bluepill --no-privileged quit"
end
desc "Load bluepill configuration and start it"
task :start, :roles => [:app] do
run "cd #{current_path} && bundle exec bluepill --no-privileged load /home/mi/production/current/config/delayed_job.bluepill"
end
desc "Prints bluepills monitored processes statuses"
task :status, :roles => [:app] do
run "cd #{current_path} && bundle exec bluepill --no-privileged status"
end
end
Надеюсь, это поможет немного.