Laravel AWS SQS例外情况“;413“请求实体太大”;

Laravel AWS SQS例外情况“;413“请求实体太大”;,laravel,aws-lambda,amazon-sqs,laravel-excel,laravel-vapor,Laravel,Aws Lambda,Amazon Sqs,Laravel Excel,Laravel Vapor,我已经被困了一段时间,想弄清楚下面的异常情况,任何帮助都将是必要的。 我们正在Laravel项目中使用AWS Lambda服务。我们正在使用将大量数据导出到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 executi

我已经被困了一段时间,想弄清楚下面的异常情况,任何帮助都将是必要的。 我们正在Laravel项目中使用AWS Lambda服务。我们正在使用将大量数据导出到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]
从:

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

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

输出
HTTP内容长度超过1662976字节
表明我的猜测可能是正确的


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

场景
将数据发送到SQS队列的硬限制为
256KB
。发生这种情况是因为我正在向SQS队列发送集合对象,而每个对象都有多个关系,因此对象大小变得太大

AWS解决方案
将集合对象数组中的ID传递给SQS队列有助于解决
实体太大的问题。

Excel解决方案

我没有使用append方法,而是使用append方法将行添加到csv文件中。我已经测试了50k行,效果非常好。不要一次处理所有行,您可能会进入AWS
timeout
异常,我认为每个队列
15分钟

是的,文件可能很大,这就是我们在SQS队列中处理的原因。在这种情况下,你有什么建议呢?我将引用我自己:)
这种情况下的常见模式是将文件上载到S3,并通过队列发送对对象的引用。
将数据上载到S3,并在队列中发送bucket name+object key。答案的第一部分是正确的。将文件上载到s3并从队列发送对对象的引用。我们遇到了一个定制的解决方案,我将在回答中发布,以便它可以帮助其他人。