Похоже, что мы, возможно, слишком быстро отправляли почту на Amazon SES, что вызвало какую-то непостоянную проблему с подключением - мы исправили это, добавив delay
к нашим работам в очереди:
php artisan queue:work --sleep=3 --tries=3 --delay=30
Задержка используется всякий раз, когда задание не выполняется, после попытки будет предпринята попытка повторной попытки - поэтому в приведенной выше команде при сбое задания повторная попытка будет предпринята через 30 секунд. В то же время другие задания все еще могут обрабатываться из очереди, и по истечении 30 сек они снова получат это задание и попытаются повторить его.
По умолчанию Laravel имеет задержку 0
, что означает, что как только задание не будет выполнено, оно немедленно попытается повторить попытку, что, вероятно, привело к возникновению проблем, поскольку в большинстве ситуаций в идеале вам потребуется немного льготного периода для повторения неудачных заданий.
В дополнение к этому, мы также настроили небольшое событие, которое прослушивает всякий раз, когда возникает исключение в отношении этого исключения SwiftMailer, которое сообщит об исключении, немного подождет и затем перезапустит работника очереди (изящно), что означает следующее Если задание будет выбрано из очереди, оно перезапустит весь процесс - хотя это еще не сработало для нас, оно может оказаться полезным, если вы испытываете периодические проблемы с соединением с долго выполняющимися процессами.
// Added in `AppServiceProvider` under `boot` function
if ($this->app->runningInConsole()) {
$this->app['queue']->failing(function (\Illuminate\Queue\Events\JobFailed $event) {
if (strpos($event->exception, 'response code 250')) {
report(new \Exception('Got swift 250 error, restarting queue.'));
sleep(5);
\Artisan::call('queue:restart');
}
});
}