
ActiveJob, sidekiq, sidekiq-schedulerを使ってRailsで定期処理
Railsで何か作る時、ほぼバックグランド処理を毎回作っているので、初期テンプレートに加えようと決意した今日このごろ。Rails4.2から導入されているActiveJobとSidekiq、そしてそれをcronのように定期実行してくれるsidekiq-schedulerに関するメモを書いておきます📝
環境
- ruby: 2.5.1
- rails: 5.2.0
- redis
Redisがない場合はサクっとbrew install redis
などしてください。
インストール&準備
とりあえず必要なgemをザザっとインストール
gem 'sidekiq'
gem 'sidekiq-scheduler'
gem 'sinatra', require: false
sinatraはSidekiqのジョブの管理画面に利用します。
次に、config/environments/各環境.rbの中に
config.active_job.queue_adapter = :sidekiq
を追加しておきます。
ActiveJob+Sidekiqを使ってみる
ActiveJobを使うので、コマンドはすごく簡単
$ rails g job hello_sidekiq
で、app/jobs/hello_job.rbが生成されます。試しに動かすために適当なputsを書きます。
class HelloSidekiqJob < ApplicationJob
def perform(args)
puts args
end
end
試しにrailsとredisとsidekiqを起動させ、rails c
もしくはrails runnner
でJobをキックしてみます。
$ rails runner "HelloSidekiqJob.perform_later('hoge')"
すると、無事出力にhogeという文字が出力されました🎉 んー、簡単!
時間を置いて処理したい場合は
HelloSidekiqJob.set(wait: 1.min).perform_later('hoge')
といった具合に書きます。
sidekiq-shcedulerを使って定期処理をする
ここからsidekiq-schedulerを起動するのは非常に簡単です。
gemは最初にインストールしてあるので、config/sidekiq.ymlを生成し、
:schedule:
HelloSidekiqJob:
every: 1m
args: "Hello sidekiq-scheduler!!"
と書くだけで、上記のymlだと1分ごとにHello sidekiq-scheduler!
と出力してくれます。
管理画面を表示する
config/routes.rbに追加するだけで、サクっと管理画面を表示できます。でも、本番などでユーザーに見えるのは良くないので、とりあえずサクっとBasic認証を追加しておきます。
Rails.application.routes.draw do
require 'sidekiq/web'
require 'sidekiq-scheduler/web'
Sidekiq::Web.use Rack::Auth::Basic do |username, password|
username == 'YOUR_NAME' && password == 'YOUR_PASSWORD'
end
mount Sidekiq::Web, at: "/sidekiq"
#~~省略~~
end
これで http://localhost:3000/sidekiq にアクセスすれば、sidekiqのキュー管理画面が表示されます。
recurning_jobsというタブをクリックすると、schedulerのキューを管理する画面が表示できます。
いやぁー、便利!一時停止とかもここでできるのが素晴らしい👏
というわけで、ActiveJob+sidekiq+sidekiq-schedulerの簡単な使い方でした。これ自分がいつも使う初期テンプレートにもう入れておこうかなぁ。