Задание выполнялось слишком много раз или выполнялось слишком долго

У меня есть работа, которая локально работает безупречно, но на производстве я сталкиваюсь с проблемами, когда она не работает. Я охватил весь handle() символом try/catch, и я не вижу, чтобы в Bugsnag ничего регистрировалось, несмотря на множество других исключений, которые были развернуты в других местах.

public function handle() {
    try {

        // do stuff

    } catch (\Exception $e) {
        Bugsnag::notifyException($e);

        throw $e;
    }
}

Согласно Laravel Horizon, это задание очереди выполняется в течение 0.0026001930236816406 секунд, и я никогда не замечаю его работы и не вижу других ошибок. в таблице failed_jobs, поскольку это относится к этой работе.

config / queue.php

    'redis' => [
        'driver' => 'redis',
        'connection' => 'default',
        'queue' => 'default',
        'retry_after' => (60 * 10), // 10 minutes
        'block_for' => null,
    ],

config / horizon.php

'environments' => [
    'production' => [
        'supervisor'        => [
            'connection'    => 'redis',
            'queue'         => [
                'default',
            ],
            'balance'       => 'auto',
            'processes'     => 10,
            'tries'         => 3,

            // 10 seconds under the queue's retry_after to avoid overlap
            'timeout'       => (60 * 10) - 10, // Just under 10 mins
        ],

Если что-то заставляет эту работу повторяться снова и снова, как я могу узнать, как это сделать? Я в растерянности.

На данный момент расследование

  • Я ожидаю, что смогу выполнить запрос:
SELECT DISTINCT exception, COUNT(id) as errors
FROM failed_jobs 
WHERE payload LIKE '%[TAG-JOB-HAS]%' 
GROUP BY exception;

Чтобы увидеть больше, чем это сообщение об ошибке:

Задание выполнялось слишком много раз или выполнялось слишком долго

но это все, что я вижу.

  • Панель мониторинга Laravel Horizon показывает, что рассматриваемое задание выполняется ‹1 секунду, поэтому я знаю, что на самом деле это не так. тайм-аут.

person Webnet    schedule 31.10.2018    source источник
comment
Вы пробовали регистрировать отладочные операторы, чтобы доказать, что задание действительно было выполнено? Можете ли вы включить дополнительную информацию о том, что на самом деле делает задание, и, возможно, немного кода? Это могло произойти из-за того, что не генерировались исключения.   -  person Travis Britz    schedule 04.11.2018
comment
... но в процессе производства я сталкиваюсь с проблемами, когда это не работает - что именно не работает? Вы видите ошибку в логах?   -  person Laurence    schedule 04.11.2018
comment
Просто подумайте, это строка Bugsnag::notifyException($e) вызывает исключение, заставляющее Laravel повторно запрашивать ваше задание для повторной попытки?   -  person Jamesking56    schedule 05.11.2018
comment
Что такое // do stuff? Делает ли он что-нибудь странное, например, call exit () или die ()?   -  person Travis Britz    schedule 06.11.2018
comment
Вы перезапустили очередь после добавления try catch к функции handle?   -  person Elie    schedule 06.11.2018
comment
Я тоже получил эту ошибку, и моя настройка очереди добавляет tries options: php artisan queue:work --tries=3, и вы должны проверить это в документе laravel.com/docs/5.5/queues#failed-job-events   -  person bangnokia    schedule 06.11.2018
comment
Попробуйте поймать \Throwable вместо \Exception. \Exception не будет обнаруживать внутренние ошибки PHP. Это тебе что-нибудь даст? Также, как уже упоминалось, убедитесь, что проблема не в Bugsnag.   -  person patricus    schedule 08.11.2018


Ответы (3)


Попытайтесь поймать исключение в неудачном методе, заданном laravel

/**
* The job failed to process.
*
* @param  Exception  $exception
* @return void
*/
public function failed(Exception $exception)
{
    // Send user notification of failure, etc...
}

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

person Anil Kumar    schedule 06.11.2018

У меня такая же проблема

Я исправил это, увеличив параметр retry_after

убедитесь, что значение retry_after больше, чем время, необходимое для выполнения задания

в файле config / queue.php

    'connections' => [

    'sync' => [
        'driver' => 'sync',
    ],

    'database' => [
        'driver' => 'database',
        'table' => 'jobs',
        'queue' => 'default',
        'retry_after' => 9000,
    ],
person Yasser    schedule 11.07.2019
comment
Вы знаете, почему параметр retry_after не влияет на очередь на моем локальном компьютере, но влияет на очередь на сервере? - person mark DE Jong; 18.12.2019

Согласно документации, вы можете справиться с ошибкой задания двумя распространенными способами:

  • использование событий неудачной работы
  • используя метод failed().

В первом случае вы можете обрабатывать все задания, используя метод Queue::failing(). В качестве параметра вы получите событие Illuminate\Queue\Events\JobFailed, содержащее исключение.

В другом случае вы можете использовать failed() метод, он должен быть размещен рядом с вашим handle() методом. Вы также можете получить Exception $exception в качестве параметра.

Пример:

public function failed(\Throwable $exception)
{
    // Log failure
}

Надеюсь это поможет.

person a_sarana    schedule 09.11.2018