LoginSignup
5
2

More than 5 years have passed since last update.

AWS Elastic Beanstalk でDelayed Jobのworkerを運用する

Posted at

メールやslack通知を非同期実行するのに Delayed jobを導入。
.ebextensionsでworker起動しようと思ったが、killして起動し直すのも面倒だし、止まってないかの監視も必要なので、Rakeタスクで止まってたら起動する処理をスケジューラで実行することにした。
Modules::LogNoticeModules::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
...

標準出力、標準エラー出力を破棄しているが、ログに出すのも余裕があれば検討。

参考

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2