メールやslack通知を非同期実行するのに Delayed jobを導入。
.ebextensions
でworker起動しようと思ったが、killして起動し直すのも面倒だし、止まってないかの監視も必要なので、Rakeタスクで止まってたら起動する処理をスケジューラで実行することにした。
(Modules::LogNotice
、Modules::SlackNotifierJob
はログ書き出し、slack通知を行うJob。)
lib/tasks/delayed_jobs.rake
namespace :delayed_jobs do
desc 'delayed_job のプロセスを起動'
task start_up: :environment do
Rails.logger.info "[BATCH]delayed_jobs.start_up is begun."
ps = `ps aux | grep jobs`
Rails.logger.info ps
if !Rails.env.development? && !ps.match(/bin\/rake jobs:work *\n/)
# バックグラウンドでjobを起動。
if system('cd /var/app/current && nohup bundle exec rake jobs:work > /dev/null 2>&1 &')
Modules::LogNotice.perform ['jobが起動していなかったので起動しました。']
else
message = 'jobの起動に失敗しました。確認してください。'
Rails.logger.fatal message
Modules::SlackNotifierJob.perform_now({ text: message }, 'danger')
end
end
Rails.logger.info "[BATCH]delayed_jobs.start_up is finished."
end
end
config/schedule.rb
...
every 10.minute do
command "cd /var/app/current && bundle exec rake delayed_jobs:start_up"
end
...
標準出力、標準エラー出力を破棄しているが、ログに出すのも余裕があれば検討。
参考