Closed6

ActiveJobとSidekiqを使ったリトライ制御について

N04hN04h

SidekiqのWikiから引用

The default Active Job retry scheme—when using retry_on—is 5 retries, 3 seconds apart. Once this is done (after 15-30 seconds), Active Job will kick the job back to Sidekiq, where Sidekiq's retries with exponential backoff will take over.

つまり、ActiveJobのリトライ処理がおわったら、Sidekiqでもリトライしてしまう?
ActiveJobのリトライ回数 * Sidekiqのリトライ回数ってなってしまうのか??

N04hN04h

以下Jobを用意

class RetryTestJob < ApplicationJob
  retry_on StandardError, attempts: 2, wait: 5.seconds

  def perform
    p "perform"
    raise StandardError
  end
end
N04hN04h

結果 ... 設定した2回を超えて再実行されている

Sidekiqの管理画面をみたところ、
失敗したJobの実行回数と、再試行の予定がされていることが確認できる。

N04hN04h

こんな記述があった
https://github.com/mperham/sidekiq/wiki/Error-Handling#automatic-job-retry

Sidekiq will retry failures with an exponential backoff using the formula (retry_count ** 4) + 15 + (rand(30) * (retry_count + 1)) (i.e. 15, 16, 31, 96, 271, ... seconds + a random amount of time). It will perform 25 retries over approximately 21 days. Assuming you deploy a bug fix within that time, the job will get retried and successfully processed. After 25 times, Sidekiq will move that job to the Dead Job queue, assuming that it will need manual intervention to work.

指数関数的にだんだん実行する間隔があいていきつつ、
自動的に再試行を行うようにしてくれているとのこと。

なので、この機能を無効化しておかないと想定以上に実行されてしまうことになるのか

N04hN04h
sidekiq_options retry: false

を追記することで無効化できた。

結論としては上記設定しない場合、ActiveJobのリトライ回数 + Sidekiqのリトライ回数 って感じ

このスクラップは2022/05/12にクローズされました