排队的 Laravel 通知卡在 AWS SQS 上

She*_*ock 8 php amazon-sqs laravel amazon-elastic-beanstalk

我在 AWS 上有一个工作人员处理排队的 Laravel 通知。一些通知被发送出去,但其他通知卡在队列中,我不知道为什么。

我查看了 Beanstalk 中的日志,看到了三种不同类型的错误:

2020/11/03 09:22:34 [emerg] 10932#0: *30 malloc(4096) failed (12: Cannot allocate memory) while reading upstream, client: 127.0.0.1, server: , request: "POST /worker/queue HTTP/1.1", upstream: "fastcgi://unix:/run/php-fpm/www.sock:", host: "localhost"

我也在 Bugsnag 上看到内存不足问题,但没有任何堆栈跟踪。

另一个错误是这个:

2020/11/02 14:50:07 [error] 10241#0: *2623 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 127.0.0.1, server: , request: "POST /worker/queue HTTP/1.1", upstream: "fastcgi://unix:/run/php-fpm/www.sock", host: "localhost"

这是最后一个:

2020/11/02 15:00:24 [error] 10241#0: *2698 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 127.0.0.1, server: , request: "POST /worker/queue HTTP/1.1", upstream: "fastcgi://unix:/run/php-fpm/www.sock:", host: "localhost"

我真的不明白我能做些什么来解决这些错误。这只是一个基本的 Laravel / EBS / SQS 设置,队列唯一要做的就是处理通知。有时一次几十个。我正在运行一个t2.micro,并假设这足以发送几封电子邮件?我已经将环境提升到一个t2.large但无济于事。

我注意到消息最终在队列中,然后获得状态“正在传输的消息”,但随后在 Laravel 方面遇到了各种麻烦。但我没有得到任何有用的错误。

所有实现代码似乎都很好,因为前几个通知按预期发出,如果我根本不排队,所有通知都会立即发送。

排队的通知最终会生成两个不同的异常:MaxAttemptsExceededExceptionOut of Memory FatalError,但都不会将我引向实际的潜在问题。

我在哪里可以进一步调试?


更新

请参阅我对问题和解决方案的回答。在工作人员尝试为仍必须创建的对象发送通知之前,数据库事务尚未完成。

600*_*604 4

当前分配给 PHP 的内存限制是多少?您可以通过运行以下命令来确定:

php -i | grep memory_limit
Run Code Online (Sandbox Code Playgroud)

您可以通过运行以下命令来增加此值:

sed -i -e 's/memory_limit = [current-limit]/memory_limit = [new-limit]/g' [full-path-to-php-ini]
Run Code Online (Sandbox Code Playgroud)

只需将[current-limit]替换为第一个命令中显示的值,并将[new-limit]替换为新的合理值。这可能需要反复试验。将[full-path-to-php-ini]替换为失败进程所使用的 php.ini 的完整路径。要找到它,请运行:

php -i | grep php.ini
Run Code Online (Sandbox Code Playgroud)

  • 我添加了一个解释问题和解决方案的答案。感谢您的帮助! (2认同)