弊社では、いくつかの案件でHerokuを本番環境として利用しています。
先日、その中の1案件で「1〜2週間に1回ぐらいの頻度で実行したい処理がある」という要望があがりました。
HerokuにはCronのような仕組みとして、Heroku Schedulerというアドオンが用意されています。
しかし、Schedularでは以下の実行間隔しか選択することができません。
- 日次
- 1時間ごと
- 10分ごと
SideKiqなどの別コンポーネントを使えば、実現できますが、今回はもっと手軽な方法を探していました。
※ 今回の案件では元々ワーカーを使っておらず、これだけのためにワーカーを増やすのは費用面などから避けたかった
最終的に、ジョブとして実行するRakeタスク側に手を加えることで対応しました。
namespace :example do
task execute_job: :environment do
next unless [1, 15].include?(Time.current.day)
# 処理
end
end
このように書くことで、1日と15日にしかexample:execute_job
は実行されません。
Timecopなどを使えばユニットテストでの確認も可能です。
とても単純な方法ですが、現在のところ問題なく動いています。
このSchedularの例のように、Herokuにはいくつかの制限がありますが、Review Appsのように便利な機能もたくさんあるので、引き続き活用していきたいと思います。