ActiveJob, sidekiq, sidekiq-schedulerを使ってRailsで定期処理

この記事を書いたひと: @t4traw 2018年9月11日

Railsで何か作る時、ほぼバックグランド処理を毎回作っているので、初期テンプレートに加えようと決意した今日このごろ。Rails4.2から導入されているActiveJobとSidekiq、そしてそれをcronのように定期実行してくれるsidekiq-schedulerに関するメモを書いておきます📝

環境

  • ruby: 2.5.1
  • rails: 5.2.0
  • redis

Redisがない場合はサクっとbrew install redisなどしてください。

インストール&準備

とりあえず必要なgemをザザっとインストール

Gemfile
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を書きます。

app/jobs/hello_job.rb
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を生成し、

config/sidekiq.yml
:schedule:
  HelloSidekiqJob:
    every: 1m
    args: "Hello sidekiq-scheduler!!"

と書くだけで、上記のymlだと1分ごとにHello sidekiq-scheduler!と出力してくれます。

管理画面を表示する

config/routes.rbに追加するだけで、サクっと管理画面を表示できます。でも、本番などでユーザーに見えるのは良くないので、とりあえずサクっとBasic認証を追加しておきます。

config/routes.rb
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の簡単な使い方でした。これ自分がいつも使う初期テンプレートにもう入れておこうかなぁ。