Поддерживает ли Rails ActiveJob следующие стратегии повтора?
Линейный откат
Линейная отсрочка предполагает ожидание постепенно увеличивающегося фиксированного интервала между повторными попытками.
Линейный сдвиг джиттера
Линейная отсрочка джиттера изменяет стратегию линейной отсрочки, добавляя случайность в интервалы повторных попыток. Эта стратегия по-прежнему линейно увеличивает задержку, но добавляет случайное «дрожание» к каждому интервалу.
Экспоненциальный откат
Экспоненциальная отсрочка предполагает экспоненциальное увеличение задержки между повторными попытками. Интервал может начинаться с 1 секунды, затем увеличиваться до 2 секунд, 4 секунд, 8 секунд и т. д., обычно до максимальной задержки. Этот подход более агрессивен в распределении повторных попыток, чем линейная отсрочка.
Экспоненциальный сдвиг джиттера
Экспоненциальная задержка джиттера сочетает в себе экспоненциальную задержку со случайностью. После каждой повторной попытки интервал отсрочки увеличивается экспоненциально, а затем применяется случайный джиттер. Джиттер может быть аддитивным (добавление случайной величины к экспоненциальной задержке) или мультипликативным (умножение экспоненциальной задержки на случайный коэффициент).





Вы можете создать любую необходимую вам стратегию, передав процедуру в качестве опции :wait:
# Linear Backoff
retry_on Timeout::Error, wait: ->(executions) { executions * 10 }
# Linear Jitter Backoff
retry_on Timeout::Error, wait: ->(executions) {
seconds = executions * 10
jitter = 0.3
seconds + seconds * rand * jitter
}
# Exponential Backoff
retry_on Timeout::Error, wait: ->(executions) { 2 ** executions }
# Exponential Jitter Backoff
retry_on Timeout::Error, wait: ->(executions) {
seconds = 2 ** executions
jitter = 0.3
seconds + seconds * rand * jitter
}
Обратите внимание, что существует отдельная опция :jitter, которая не применяется, когда :wait является процедурой.
:wait— повторно ставит задание в очередь с задержкой, указанной либо в секундах (по умолчанию: 3 секунды), как вычислительный процесс, который принимает количество выполнений в качестве аргумента, либо как ссылку на символ:polynomially_longer, который применяет алгоритм ожидания. из((executions**4) + (Kernel.rand * (executions**4) * jitter)) + 2(сначала ожидание ~3 секунды, затем ~18 секунд, затем ~83 секунды и т. д.)