It will perform 25 retries over approximately 21 days.
Sidekiqの再試行が デフォルト設定の場合にどのくらいの間隔で行われるか が知りたかったのだけれども、公式 を読んでも 約21日で25回行う
くらいしか書かれていなかったので表にしてみた。
追記(2019-02-19)
と思ったら、公式 に書いてあった。プルダウン見てなかった。。。
リトライの計算式
公式を参照。
(retry_count ** 4) + 15 + (rand(30) * (retry_count + 1))
結果
前提
- あくまで目安
- 最短、平均、最長の各値は、最初のジョブが失敗してから実行されるまでの期間を表す
- ジョブ自体の処理時間等は加味していない(仮に処理が10秒かかるものだとすれば、2回目が実行されるタイミングは最短でも41秒後)
-
再試行回数
は、何回目の再試行かを表す -
最短
は、上記計算式のrand(30)
が毎回0
を返した場合としている -
平均
は、上記計算式のrand(30)
が毎回15
を返した場合としている -
最長
は、上記計算式の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) }