1

我已经被困了一段时间来弄清楚下面的异常,任何帮助都会得到解决。我们在 Laravel 项目中使用 AWS Lambda 服务。我们正在使用Laravel Excel将大量数据导出到 CSV 文件,并且我们正在通过 Laravel SQS 队列来执行此操作。

php 版本:7.2
Laravel 框架:7.30.1
Laravel Excel:3.1

例外:

Aws\Sqs\Exception\SqsException /tmp/vendor/aws/aws-sdk-php...
stage.ERROR: Error executing "SendMessage" on "https://sqs.eu-central- 
1.amazonaws.com"; AWS HTTP error: Client error: `POST https://sqs.eu- 
central-1.amazonaws.com/` resulted in a `413 Request Entity Too Large` 
response:
HTTP content length exceeded 1662976 bytes.
Unable to parse error information from response - Error parsing XML: String could not be parsed as 
XML {"exception":"[object] (Aws\\Sqs\\Exception\\SqsException(code: 0): Error executing      
\"SendMessage\" on \"https://sqs.eu-central-1.amazonaws.com/"; AWS 
HTTP error: Client error: `POST https://sqs.eu-central-1.amazonaws.com/` resulted in a `413 Request Entity Too Large` response:
HTTP content length exceeded 1662976 bytes.
Unable to parse error information from response - Error parsing XML: String could not be parsed as 
XML at /tmp/vendor/aws/aws-sdk-php/src/WrappedHttpHandler.php:195)
[stacktrace]
4

2 回答 2

2

文档

消息大小
最小消息大小为 1 个字节(1 个字符)。最大值为 262,144 字节 (256 KB)。

我的猜测是您尝试发送的文件大于256KB,这是 AWS 中 SQS 消息的硬限制。

输出HTTP content length exceeded 1662976 bytes表明我的猜测可能是正确的。

这种情况下的常见模式是将文件上传到 S3 并通过队列发送对对象的引用。

于 2021-02-12T12:58:36.680 回答
0

场景
来自AWS docs将数据发送到 SQS 队列的硬限制是256KB. 发生这种情况是因为我将 Collection 对象发送到 SQS 队列,并且每个对象都有多个急切加载关系,因此对象大小变得太大。

AWS 解决方案
将集合对象数组中的 id 传递给 SQS 队列有助于解决Entity Too Large问题。

Excel 解决方案我没有使用Laravel Excel
,而是使用Laravel Storage append 方法将行添加到我的 csv 文件中。我已经测试了 50k 行,效果很好。不要一次处理所有行,您可能会陷入 AWS异常,我相信这是每个​​队列。timeout15 minutes

于 2021-03-11T05:57:56.230 回答