Sidetiq亡き後の定期実行
NO LONGER MAINTAINED!!!
Rubyアプリケーションで定期的にジョブを回す場合(毎日2時にElasticsearchのインデックスを再構築とか)、かつてはsidetiqをつかうのが定番であったようです。
しかしsidetiqはずっと開発が停滞しており、とうとう今年1月に「もうメンテナンスしないよ」と明言されてしまいました。
私の関わっているプロジェクトでは10秒ごとにあるジョブを動かすためにSidetiqを利用しています。しかしメンテされていないgemを使い続けるべきではないだろう、というわけでsidetiqを置き換える方法を探してみました。
Alternatives
Sidekiq + clockwork
Sidekiqの利用例に載っている方法。clockworkというcronの代わりをするというgemを使います。
Sidekiqのレポジトリにのっているということは評価指標のひとつですが、clockworkの開発はそれほど活発ではないようですし、clockworkプロセスを動かさないといけないのも難点かと。これまでRailsアプリケーションとSidekiq(+Sidetiq)という構成であった場合、デプロイ処理も修正する必要があるでしょう。
sidekiq-cron
sidekiq-cronはSidetiqを直接置き換え可能な候補の1つです。アプリケーション側の修正だけで済みます。開発も活発にされているようですし、Star数も多いので乗り換え先としては最有力でしょう。
READMEから使い方を引用すると、
class HardWorker
include Sidekiq::Worker
def perform(name, count)
# do something
end
end
Sidekiq::Cron::Job.create(name: 'Hard worker - every 5min', cron: '*/5 * * * *', class: 'HardWorker')
# => true
というふうにジョブを作るようです。実行間隔はcronの設定と同じように設定します。
ここで1つ問題がありました。設定の記法がcronと同様ということは、最低でも実行間隔が1分になってしまいます。秒単位での指定ができません。冒頭に書いたように、私の必要なのは「10秒ごとに定期実行できる」ものであり、sidekiq-cronは採用しませんでした。
sidekiq-scheduler
sidekiq-schedulerは前述のsidekiq-cronよりは少ないものの、そこそこの数のstarも集めており開発も継続中です。
こちらはsidekiq.ymlに設定を追記するのみです。個人的にはsidekiq-cronのようにアプリケーションコード内に書くより、こちらのほうが好みです。
:schedule:
hello_world:
every: 1m # Runs once per minute
class: HelloWorld
また、こちらは秒単位での間隔指定にも対応しており、私の要件にマッチしています。こちらを採用することにしました。
コードの修正は
- Gemfileからsidetiqを取り除きsidekiq-schedulerに置き換える
- sidetiqを利用している部分のコードを置き換える
- sidekiq.ymlに設定を移す
だけでした。ほとんどあっという間です。
Conclusion
Sidetiqを使っている人は、早めに乗り換えましょう。その際はsidekiq-cronかsidekiq-schedulerが候補になることでしょう。