delayed_jobの自動再起動

13
delayed_job のののののの Shinjuku.rb #29 firewood@github

Upload: firewood

Post on 14-Apr-2017

707 views

Category:

Software


0 download

TRANSCRIPT

Page 1: delayed_jobの自動再起動

delayed_job の自動再起動

Shinjuku.rb #29firewood@github

Page 2: delayed_jobの自動再起動

対象サイト https://competitiveprogramming.info/ Rails 4.0 コンテスト情報の更新の際に delayed_j

ob を使用

Page 3: delayed_jobの自動再起動

背景 delayed_job のイメージ ( 偏見 )

redis 等が不要なので手軽 たまにゾンビプロセス化する

Page 4: delayed_jobの自動再起動

要求 落ちること自体は仕方ない ただし、正常に動いてないなら自動的

に再起動してほしい

Page 5: delayed_jobの自動再起動

信頼する・しない monit ( デーモンの監視 )

とりあえず信頼する delayed_job

完了したタスクについては信頼する 常に生きてるとは思わないことにする

Page 6: delayed_jobの自動再起動

monit https://mmonit.com/monit/ 様々な種類のリソースが監視できる

process ID(PID) 、ポート、 CPU 負荷など

Page 7: delayed_jobの自動再起動

何を監視するか決める プロセスは存在しているが仕事をして

いなかったり、ポートは開いているがサービスを提供していなかったりする

実際の仕事を監視したほうがいい 一箇所だけならアプリケーションレベル

で監視する

Page 8: delayed_jobの自動再起動

基本方針 cron で delayed_job にタスクを積む

ファイルの日付を更新するだけの touch というタスク

タスクが実行されなかったら monit 経由で再起動させる

Page 9: delayed_jobの自動再起動

crontab -l0,30 * * * * /bin/bash -lc 'cd /data/compinfo/current && ./bin/rake hoge:touch‘

30 分に一度タスクを積む

Page 10: delayed_jobの自動再起動

/etc/monit.d/delayed_jobcheck file delayed_job with path /data/compinfo/shared/tmp/pids/

alive if timestamp > 60 minutes then restart start program = “/bin/su - user –c 'cd /data/compinfo/current; bin/delayed_job start; bin/rake hoge:touch'“ stop program = "/bin/su - user –c 'cd /data/compinfo/current; bin/delayed_job stop'“

60 分更新がなければ、 delayed_jobを再起動させてタスクを積む

Page 11: delayed_jobの自動再起動

lib/tasks/hoge.rake namespace :hoge do task :touch => :environment do Hoge.delay.touch endend

Hoge.touch をタスクに積む

Page 12: delayed_jobの自動再起動

touchclass Hoge < ActiveRecord::Base def self.touch FileUtils.touch Rails.root.join('tmp/pids/alive') endend

ファイルのタイムスタンプを更新する

Page 13: delayed_jobの自動再起動

課題 再起動するまでが長い

→ プロセスが落ちている場合にも再起動する

monit の default の監視間隔が 1 分なので、復帰直後に重いタスクがあると再起動してしまう→ すべてのタスクの先頭で Hoge.touch を

呼ぶようにする