Swift_TransportException:预期响应代码 250,但在使用 Amazon SES 的队列工作程序中间歇性地得到空响应
Swift_TransportException: Expected response code 250 but got an empty response intermittently in queue worker using Amazon SES
我们在使用 Amazon SES 和仅使用 SMTP 驱动程序发送邮件时经常遇到来自排队作业的 Swift_TransportException: Expected response code 250 but got an empty response
。这种情况会间歇性发生,但似乎会导致我们所有的邮件在初始错误发生后停止发送 - 重新启动队列工作程序可以修复它,但不可避免地会间歇性地再次发生该问题。
我们考虑过的一些事情:
- 可能是亚马逊节流?根据我们的使用情况,我们似乎没有受到限制。
- 连接断开并且 Laravel/SwiftMail 无法正确重新连接?
- 从 SMTP 驱动程序切换到 SES 驱动程序 - 尽管在我们首先理解为什么会收到此错误之前我们不想完全致力于此
注意:在 Whosebug 上搜索了其他问题,但它们更多地与配置错误有关 - 这个问题不是关于邮件直接无法正常工作,而是关于间歇性故障。
看来我们在 Amazon SES 上发送邮件的速度可能太快,导致了某种间歇性连接问题 - 我们已通过向排队的作业添加 delay
来解决此问题:
php artisan queue:work --sleep=3 --tries=3 --delay=30
每当作业失败时都会使用延迟,它会在延迟后尝试重试 - 所以在上面的命令中,当作业失败时它会在 30 秒后重试。与此同时,其他作业仍然可以从队列中处理,一旦 30 秒结束,它将再次拉出该作业并重试。
默认情况下 Laravel has a delay of 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');
}
});
}
我们在使用 Amazon SES 和仅使用 SMTP 驱动程序发送邮件时经常遇到来自排队作业的 Swift_TransportException: Expected response code 250 but got an empty response
。这种情况会间歇性发生,但似乎会导致我们所有的邮件在初始错误发生后停止发送 - 重新启动队列工作程序可以修复它,但不可避免地会间歇性地再次发生该问题。
我们考虑过的一些事情:
- 可能是亚马逊节流?根据我们的使用情况,我们似乎没有受到限制。
- 连接断开并且 Laravel/SwiftMail 无法正确重新连接?
- 从 SMTP 驱动程序切换到 SES 驱动程序 - 尽管在我们首先理解为什么会收到此错误之前我们不想完全致力于此
注意:在 Whosebug 上搜索了其他问题,但它们更多地与配置错误有关 - 这个问题不是关于邮件直接无法正常工作,而是关于间歇性故障。
看来我们在 Amazon SES 上发送邮件的速度可能太快,导致了某种间歇性连接问题 - 我们已通过向排队的作业添加 delay
来解决此问题:
php artisan queue:work --sleep=3 --tries=3 --delay=30
每当作业失败时都会使用延迟,它会在延迟后尝试重试 - 所以在上面的命令中,当作业失败时它会在 30 秒后重试。与此同时,其他作业仍然可以从队列中处理,一旦 30 秒结束,它将再次拉出该作业并重试。
默认情况下 Laravel has a delay of 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');
}
});
}