Help us understand the problem. What is going on with this article?

Sidekiqのデフォルト再試行スケジュール表(目安)

More than 1 year has passed since last update.

It will perform 25 retries over approximately 21 days.

Sidekiqの再試行が デフォルト設定の場合にどのくらいの間隔で行われるか が知りたかったのだけれども、公式 を読んでも 約21日で25回行う くらいしか書かれていなかったので表にしてみた。

追記(2019-02-19)

と思ったら、公式 に書いてあった。プルダウン見てなかった。。。

リトライの計算式

公式を参照。

(retry_count ** 4) + 15 + (rand(30) * (retry_count + 1))

結果

前提

  1. あくまで目安
  2. 最短、平均、最長の各値は、最初のジョブが失敗してから実行されるまでの期間を表す
  3. ジョブ自体の処理時間等は加味していない(仮に処理が10秒かかるものだとすれば、2回目が実行されるタイミングは最短でも41秒後)
  4. 再試行回数は、何回目の再試行かを表す
  5. 最短は、上記計算式のrand(30) が毎回0を返した場合としている
  6. 平均は、上記計算式のrand(30) が毎回15を返した場合としている
  7. 最長は、上記計算式のrand(30) が毎回30を返した場合としている

再試行回数 最短 平均 最長
1回目 0日00時間00分15秒後 0日00時間00分30秒後 0日00時間00分45秒後
2回目 0日00時間00分31秒後 0日00時間01分16秒後 0日00時間02分01秒後
3回目 0日00時間01分02秒後 0日00時間02分32秒後 0日00時間04分02秒後
4回目 0日00時間02分38秒後 0日00時間05分08秒後 0日00時間07分38秒後
5回目 0日00時間07分09秒後 0日00時間10分54秒後 0日00時間14分39秒後
6回目 0日00時間17分49秒後 0日00時間23分04秒後 0日00時間28分19秒後
7回目 0日00時間39分40秒後 0日00時間46分40秒後 0日00時間53分40秒後
8回目 0日01時間19分56秒後 0日01時間28分56秒後 0日01時間37分56秒後
9回目 0日02時間28分27秒後 0日02時間39分42秒後 0日02時間50分57秒後
10回目 0日04時間18分03秒後 0日04時間31分48秒後 0日04時間45分33秒後
11回目 0日07時間04分58秒後 0日07時間21分28秒後 0日07時間37分58秒後
12回目 0日11時間09分14秒後 0日11時間28分44秒後 0日11時間48分14秒後
13回目 0日16時間55分05秒後 0日17時間17分50秒後 0日17時間40分35秒後
14回目 1日00時間51分21秒後 1日01時間17分36秒後 1日01時間43分51秒後
15回目 1日11時間31分52秒後 1日12時間01分52秒後 1日12時間31分52秒後
16回目 2日01時間35分52秒後 2日02時間09分52秒後 2日02時間43分52秒後
17回目 2日19時間48分23秒後 2日20時間26分38秒後 2日21時間04分53秒後
18回目 3日19時間00分39秒後 3日19時間43分24秒後 3日20時間26分09秒後
19回目 5日00時間10分30秒後 5日00時間58分00秒後 5日01時間45分30秒後
20回目 6日12時間22分46秒後 6日13時間15分16秒後 6日14時間07分46秒後
21回目 8日08時間49分41秒後 8日09時間47分26秒後 8日10時間45分11秒後
22回目 10日14時間51分17秒後 10日15時間54分32秒後 10日16時間57分47秒後
23回目 13日07時間55分48秒後 13日09時間04分48秒後 13日10時間13分48秒後
24回目 16日13時間40分04秒後 16日14時間55分04秒後 16日16時間10分04秒後
25回目 20日09時間49分55秒後 20日11時間11分10秒後 20日12時間32分25秒後

表を作った時に書いたプログラム

秒から日に変換する処理は、秒を時間表示へ変換するを使用させていただいた。

require "time"

def retry_seconds(retry_count, additional_value)
  (retry_count ** 4) + 15 + (additional_value * (retry_count + 1))
end

def print_retry_schedule(retries, execution_time)
  sec_list = (0..retries).reduce([0, 0, 0]) do |sum, retry_count|
    sum[0] += (retry_seconds(retry_count, 0) + execution_time)
    sum[1] += (retry_seconds(retry_count, 15) + execution_time)
    sum[2] += (retry_seconds(retry_count, 30) + execution_time)
    sum
  end

  str = "| #{retries + 1}回目 |"
  sec_list.each do |sec|
    day, sec_r = sec.divmod(86400)
    str += (Time.parse("1/1") + sec_r).strftime(" #{day}日%H時間%M分%S秒後 |")
  end

  p str
end

(0...25).each { |n| print_retry_schedule(n, 0) }
youkaiantena
自称天才系男子
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away