LoginSignup
28
21

More than 5 years have passed since last update.

Sidetiq亡き後の定期実行

Posted at

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から使い方を引用すると、

hard_worker.rb
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のようにアプリケーションコード内に書くより、こちらのほうが好みです。

config/sidekiq.yml
:schedule:
  hello_world:
    every: 1m   # Runs once per minute
    class: HelloWorld

また、こちらは秒単位での間隔指定にも対応しており、私の要件にマッチしています。こちらを採用することにしました。

コードの修正は
- Gemfileからsidetiqを取り除きsidekiq-schedulerに置き換える
- sidetiqを利用している部分のコードを置き換える
- sidekiq.ymlに設定を移す

だけでした。ほとんどあっという間です。

Conclusion

Sidetiqを使っている人は、早めに乗り換えましょう。その際はsidekiq-cronかsidekiq-schedulerが候補になることでしょう。

28
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
21