Задания в очереди Laravel horizon завершаются с ошибкой MaxAttemptsExceededException

#php #laravel #laravel-horizon

#php #ларавель #laravel-horizon #laravel

Вопрос:

Я отправляю задания для выполнения некоторой работы в моей очереди horizon. Похоже, что одни и те же задания всегда завершаются с ошибкой во время выполнения 60, что для меня выглядит как проблема с таймаутом:

введите описание изображения здесь

Я отправляю около 10 заданий по расписанию cron, и эти 4 всегда терпят неудачу.

Это мое config/horizon.php (только самое интересное):

 <?php

use IlluminateSupportStr;

return [

    'waits' => [
        'redis:default' => 60,
    ],

    'memory_limit' => 512,

    'defaults' => [
        'my-app-queue' => [
            'connection' => 'redis',
            'queue' => ['default'],
            'balance' => 'auto',
            'minProcesses' => 1,
            'maxProcesses' => 1,
            'balanceMaxShift' => 1,
            'balanceCooldown' => 3,
            'memory' => 512,
            'tries' => 3,
            'nice' => 0,
            'timeout' => 300,
        ],
    ],

    'environments' => [
        'production' => [
            'my-app-queue' => [
                'maxProcesses' => 10,
            ],
        ],

        'local' => [
            'my-app-queue' => [
                'maxProcesses' => 10,
            ],
        ],
    ],
];
  

Как вы можете видеть, я установил тайм-аут в 300 секунд, но задание всегда завершается неудачей на отметке 60 секунд.

Я запускаю обработчик очереди horizon в моем контейнере docker с помощью этой команды entrypoint: php /path/to/artisan horizon

Чтобы устранить проблему, я создал экземпляр класса job вручную, чтобы увидеть, где он терпит неудачу, например:

     $test = new DownloadBlockedIPFeed(8);
    $test->handle();
    exit('Done');
  

Это, кажется, занимает больше времени, чем 60 секунд, но оно завершается.

Итак, мой вопрос — как правильно установить время ожидания для laravel horizon?

Я использую laravel 8.x и последнюю версию пакета horizon.

Комментарии:

1. Похоже, что это тайм-аут PHP, а не конфигурация horizon.

2. разве php-cli не имеет max_execution_time значения -1 ? задания должны выполняться в cli и не наследовать никаких ограничений по времени выполнения. я перепроверю, просто чтобы быть уверенным.

3. Взгляните на laravel.com/docs/8.x/queues#job-expirations-and-timeouts попробуйте также добавить a retry_after со значением 300

4. Если в ваших классах заданий задан тайм-аут, они имеют приоритет над заданным по умолчанию Horizon, независимо от того, больше или меньше тайм-аут класса по умолчанию Horizon.

5. @Latheesan Вы нашли решение для этого?

Ответ №1:

Это также может быть стратегия баланса. Я обнаружил, что если я установлю для параметра «баланс» значение «авто», это приведет к ошибкам MaxAttemptsExceededException. похоже, решение состоит в том, чтобы изменить его на «простой» или «ложный».

Не уверен, что это ошибка, но я не думаю, что это ожидаемое поведение. Я видел задания, которые выполнялись (вход в метод дескриптора задания), но завершались в середине для повторной попытки.

Ответ №2:

Проверьте значение для --timeout= в порожденном horizon:supervisor процессе. Если это 60 секунд, измените timeout значение в config/horizon.php .

Также проверьте retry_after config/queue.php .