В чем смысл retry_after из config/queue.php?

Не смотря на то, что документация Laravel написана простым и ясным языком, то что написано здесь вызывает больше вопросов чем ответов?

This option specifies how many seconds the queue connection should wait before retrying a job that is being processed.

Что здесь означает "retrying"?

For example, if the value of retry_after is set to 90, the job will be released back onto the queue if it has been processing for 90 seconds without being deleted. Typically, you should set the retry_after value to the maximum number of seconds your jobs should reasonably take to complete processing.


Т.е. retry_after это что то вроде timeout? Тогда причем тут слово "retry"?

The --timeout value should always be at least several seconds shorter than your retry_after configuration value. This will ensure that a worker processing a given job is always killed before the job is retried. If your --timeout option is longer than your retry_after configuration value, your jobs may be processed twice.


А далее выясняется что кроме retry_after есть еще опция воркера --timeout (которая перекрывается значением одноименного свойства в классе задачи ). Да к тому же если timeout > retry_after , то задача выполнится 2 раза!

А теперь к практике.

class TestJob implements ShouldQueue
{
    use Dispatchable;
    
    public $timeout = 300;

    public function handle()
    {
        for($i=0; $i<=100;$i++) {
            sleep(1);
        }
    }
}


Имеем задачу которой на выполнение нужно ~100 секунд.
retry_after = 90
--timeout=110
Результат:
$ ./artisan queue:work --timeout=110
[2019-08-27 11:59:53][3] Processing: App\Jobs\TestJob
[2019-08-27 12:01:33][3] Processed:  App\Jobs\TestJob

Как видно задача выполнялась свои 100 секунд, хотя retry_after=90.
И хотя --timeout > retry_after - задача выполнилась только один раз.
Поэкспериментировал с разными значениями, но какого-либо влияния retry_after не обнаружил.

В чем смысл retry_after?
  • Вопрос задан
  • 209 просмотров
Решения вопроса 1
@bltr Автор вопроса
Наконец то разобрался.
Во первых, artisan queue:work является дочерним процессом. --timeout убивает его самого. И соответственно предполагается наличие мастер-процесса который его перезапустит. Это может быть supervisor или artisan horizon.
Во вторых, когда в воркере извлекается очередная задача на выполнение, сначала берутся задачи которые еще не запускались. А если таких нет, то берется задача которая запускалась( в другом процессе) и с момента запуска уже прошло retry_after секунд. При этом ни как не проверяется работает ли эта задача в том другом процессе или нет. Предполагается, что --timeout < retry_after и тот процесс уже умер. И поэтому возможна ситуация когда будет задача будет в работе в двух воркерах сразу.

Никак не мог обнаружить влияние retry_after, поскольку запускал только один воркер.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Sanasol
@Sanasol Куратор тега Laravel
нельзя просто так взять и загуглить ошибку
И то и другое лимит времени на выполнение, но retry_after соответственно запускает заново задачу.

timeout просто убивает видимо.

И поэтому
The --timeout value should always be at least several seconds shorter than your retry_after configuration value. This will ensure that a worker processing a given job is always killed before the job is retried. If your --timeout option is longer than your retry_after configuration value, your jobs may be processed twice.


таймаут должен быть меньше чем retry_after чтобы точно процесс был убит перед повторным запуском.
Ответ написан
Alex_Wells
@Alex_Wells
PHP/TS/Kotlin developer
--delay к повторным попыткам не имеет ни малейшего отношения. Вообще.

--delay указывает время между поллами драйвера (и.е. время между каждым запросом "хэй, привет очереди, у вас есть новые задачи?").

retry_after должен быть параметром, указывающим через сколько повторять завалившуюся джобу. И.е. случилась ошибка, через сколько повторить попытку. Хз откуда вы взяли второе описание этого параметра.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы