Swift_TransportException: ожидаемый код ответа 250, но периодически получал пустой ответ в работнике очереди, использующем Amazon SES - PullRequest
0 голосов
/ 02 марта 2020

Мы часто сталкиваемся с Swift_TransportException: Expected response code 250 but got an empty response при выполнении заданий в очереди при отправке почты с помощью Amazon SES и просто с помощью драйвера SMTP. Это происходит периодически, но, кажется, заставляет все наши письма прекращать отправку, как только происходит первоначальная ошибка - перезапуск работника очереди исправляет ее, но неизбежно проблема возникает периодически.

Некоторые вещи, которые мы рассмотрели:

  • Возможно, дросселирование Amazon? Похоже, нас не душат, хотя это зависит от нашего использования.
  • Разрыв соединения и Laravel / SwiftMail неправильно подключаются?
  • Переключение с драйвера SMTP на драйвер SES - хотя мы и не полностью не хотим это делать, прежде чем мы поймем, почему мы получаем эту ошибку, во-первых

Примечание: здесь искали другие проблемы в Stackoverflow, но они касались больше ошибок конфигурации - Проблема не в том, что письма не работают, а в прерывистом сбое.

1 Ответ

0 голосов
/ 05 марта 2020

Похоже, что мы, возможно, слишком быстро отправляли почту на 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');
        }
    });
}
...