これは何か?
SidekiqでQueueが空になってからSidekiq Workerを終了する簡単な方法。Sidekiqをdaemon化してinit scriptなどで開始、終了するような場合に使える。
利用例としては、EC2のLocalにRedisを持ってSidekiqを使用するときなどに、タスクが蒸発することを防ぐことができる。
前提知識
-
kill -TERM
とは何かを理解している。
やり方
Sidekiqにタスクを投げる側(概ねRails等)を止めてから
$ rails runner 'puts Sidekiq::Queue.new.size'
をすると、Queueに残っているタスク数が帰ってくる。なので、上記が0になってから
$ kill -TERM [Sidekiq PID]
する。TIMEOUTしてkill -9
してしまわないようにだけ注意する。
もちろんsidekiqctl
を使ってもいい。upstart等であれば、stopの時に投げられるのはTERMなので、pre-stop等で待ってあげると良い。
展望
実行時間が長いタスクをローカルのSidekiqに置いておくと全然シャットダウンされなかったり、Task executerによってはタイムアウトしてkillされちゃうので、別途Redisを立てておいてタスクを転送したりしたほうが良いかもね。
まとめ
ほら、簡単でしょ?