Kōenji

とうきょうとすぎなみく

Ruby で非同期処理をするライブラリ Sidekiq についてのメモ

Ruby で非同期処理をするのに Sidekiq を使い始めた

基本的な使い方については Rails - sidekiqの使い方 - Qiita を見れば分かる
上記記事に書かれてないことについてつらつらと自分用にメモを残しておく

いちいちワーカクラス書かないといけないの

ActiveRecord と ActionMailer に便利メソッドが自動的に生える
Delayed extensions · mperham/sidekiq Wiki

スケジューリングしたい

Scheduled Jobs · mperham/sidekiq Wiki

3時間後に実行したい場合こんな感じ

MyWorker.perform_in(3.hours, 'mike', 1)
MyWorker.perform_at(3.hours.from_now, 'mike', 1)

どうせ Sidekiq のデーモン起動しっぱなしならその中で定期処理もさせたい

Sidetiq gem を使う
tobiassvn/sidetiq

毎日実行したい場合こんな感じ

class MyWorker
  include Sidekiq::Worker
  include Sidetiq::Schedulable

  recurrence { daily }

  def perform
    # 定期処理
  end
end

めちゃくちゃ重い処理するワーカがあるんだけど同時に同じ処理走らせたくない

例えばユーザが「最新の情報に更新」ボタンを押したら非同期処理するみたいやつ
連打されたら困る

SidekiqUniqueJobs を使う
mhenrixon/sidekiq-unique-jobs

同じ引数が渡された既に動いてるワーカがある場合無視してくれる

class MyWorker
  include Sidekiq::Worker
  
  sidekiq_options unique: true

  def perform(id)
    # めちゃくちゃ重い処理
  end
end

MyWorker.perform_async(1) # 非同期処理
MyWorker.perform_async(1) # 無視される
MyWorker.perform_async(2) # 非同期処理

その他便利なサードパーティライブラリ

Related Projects · mperham/sidekiq Wiki