ActiveJobとSidekiqを使ったリトライ制御について
Sidekiqのリトライについて
ActiveJobのリトライについて
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のリトライ回数ってなってしまうのか??
以下Jobを用意
class RetryTestJob < ApplicationJob
retry_on StandardError, attempts: 2, wait: 5.seconds
def perform
p "perform"
raise StandardError
end
end
結果 ... 設定した2回を超えて再実行されている
Sidekiqの管理画面をみたところ、
失敗したJobの実行回数と、再試行の予定がされていることが確認できる。
こんな記述があった
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.
指数関数的にだんだん実行する間隔があいていきつつ、
自動的に再試行を行うようにしてくれているとのこと。
なので、この機能を無効化しておかないと想定以上に実行されてしまうことになるのか
sidekiq_options retry: false
を追記することで無効化できた。
結論としては上記設定しない場合、ActiveJobのリトライ回数 + Sidekiqのリトライ回数 って感じ