Очередь fifo Laravel-SQS - задания обрабатываются нормально, но остаются в полете и терпят неудачу

Чтобы ограничить количество заданий, поступающих из моей очереди, я добавил некоторый код в свой файл заданий PHP. После того, как работа отодвинута, я некоторое время сплю:

// random nr between 3 and 4 min
$r = rand(180, 240);
sleep($r);

Очередь, которую я использую, представляет собой очередь SQS FIFO, и отправленные задания попадают туда без проблем. Мой рабочий использует только один процесс и пытается 3 раза:

more aws-worker.conf
command=php /var/www/html/website/artisan queue:work sqs_aws --sleep=5 --tries=3
autostart=true
autorestart=true
user=root
numprocs=1

Однако, когда я отправляю 2 задания, работник очереди освобождает их примерно через 1 минуту, но не удаляет их в SQS. Так они и остаются в полете и через 3 раза получают неудавшуюся метку:

[2018-12-23 13:21:54] Processing: App\Jobs\DispatchAwsGatewayJob
[2018-12-23 13:22:56] Processing: App\Jobs\DispatchAwsGatewayJob

[2018-12-23 13:27:55] Processing: App\Jobs\DispatchAwsGatewayJob
[2018-12-23 13:29:01] Processing: App\Jobs\DispatchAwsGatewayJob

[2018-12-23 13:34:00] Processing: App\Jobs\DispatchAwsGatewayJob
[2018-12-23 13:35:06] Processing: App\Jobs\DispatchAwsGatewayJob

[2018-12-23 13:40:05] Processing: App\Jobs\DispatchAwsGatewayJob
[2018-12-23 13:40:05] Failed:     App\Jobs\DispatchAwsGatewayJob

[2018-12-23 13:41:10] Processing: App\Jobs\DispatchAwsGatewayJob
[2018-12-23 13:41:10] Failed:     App\Jobs\DispatchAwsGatewayJob

Некоторые другие детали очереди:

Default Visibility Timeout: 30 seconds
Message Retention Period:   4 days
Receive Message Wait Time:  0 seconds

Возможно, спящий код мешает очереди fifo? У меня нет других вариантов ограничить задания в очереди....


person helloworld    schedule 23.12.2018    source источник


Ответы (1)


Задания имеют тайм-аут по умолчанию, равный 60 секундам. По истечении тайм-аута рабочий уничтожается, а задание возвращается в очередь, если только не было достигнуто максимальное количество попыток, и в этом случае задание станет неудачным.

Вы можете увеличить время ожидания для заданий либо на уровне исполнителя очереди, либо на уровне задания.

Если вы хотите увеличить время ожидания для обработчика очереди, укажите время ожидания в командной строке:

php artisan queue:work --timeout=300

Если вы хотите увеличить время ожидания для определенного задания, установите свойство $timeout в классе задания:

public $timeout = 300;

Однако следующей проблемой является Default Visibility Timeout. Поскольку для него установлено всего 30 секунд, задание снова станет доступным в очереди, и другой рабочий сможет взять его и запустить. Если у вас есть только один рабочий, это не проблема. Но вы захотите исправить это сейчас, чтобы не столкнуться с проблемами позже, когда решите добавить больше работников.

Default Visibility Timeout должно быть больше, чем максимальное количество времени, которое вы ожидаете для выполнения любого из ваших заданий. Итак, если $timeout равно 300, Default Visibility Timeout должно быть > 300.

person patricus    schedule 01.03.2019