Heroku Schedularで指定日にのみ処理を実行する

clock

弊社では、いくつかの案件で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のように便利な機能もたくさんあるので、引き続き活用していきたいと思います。

TimeCrowdに戻る