【发布时间】:2021-02-21 09:42:42
【问题描述】:
我在 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 方面遇到了各种麻烦。但我没有遇到任何有用的错误。
所有实现代码似乎都很好,因为前几个通知按预期发出,如果我根本不排队,所有通知都会立即发送。
排队的通知最终会产生两个不同的异常:MaxAttemptsExceededException 和 Out of Memory FatalError,但都没有让我发现真正的潜在问题。
我在哪里可以进一步调试?
更新
请参阅我对问题和解决方案的回答。在工作人员尝试为仍需创建的对象发送通知之前,数据库事务尚未完成。
【问题讨论】:
-
你在 /var/log/fpm-php.www.log 中有什么?
-
你配置了supervisor吗? laravel.com/docs/8.x/queues#supervisor-configuration
-
@mirza 我没有那个日志文件,但我有 /var/log/php-fpm/error.log 如果这就是你的意思。我看到
fpm is running, pid 30428->ready to handle connections->systemd monitor interval set to 10000ms->Terminating ...->exiting, bye-bye!的循环 -
@jeremykenedy 我不认为 Supervisor 已配置,所以我可以看看。
标签: php laravel amazon-elastic-beanstalk amazon-sqs