簡體   English   中英

AWS SQS 異常“413 請求實體太大”

[英]AWS SQS Exception "413 Request Entity Too Large"

我已經被困了一段時間以弄清楚以下異常,任何幫助都會被拒絕。 我們在 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]

文檔

消息大小
最小消息大小為 1 個字節(1 個字符)。 最大值為 262,144 字節 (256 KB)。

我的猜測是您嘗試發送的文件大於256KB ,這是 AWS 中 SQS 消息的硬性限制。

output HTTP content length exceeded 1662976 bytes表明我的猜測可能是正確的。

這種情況下的常見模式是將文件上傳到 S3 並通過隊列發送對 object 的引用。

使用 Laravel Excel 庫在 laravel vapor 上運行 csv 導入時出現此錯誤。 我能夠在不重寫文件處理的情況下修復它。

對我來說,簡單的解決方案是在我的可導入 class implements ShouldQueue, WithChunkReading更改為implements ShouldQueueWithoutChain, WithChunkReading WithChunkReading。

例如


    <?php
    
    namespace App\Imports;
    use Maatwebsite\Excel\Concerns\WithChunkReading;
    use Maatwebsite\Excel\Concerns\ShouldQueueWithoutChain;
    
    class BaseDataImporter implements ShouldQueueWithoutChain, WithChunkReading {
    ...

這是幕后發生的事情:當 Laravel Excel 看到“WithChunkReading”時,它將所有塊序列化為一個“鏈接”作業。 如果你的 csv 文件有足夠的行,這個鏈的長度可以超過 256kb。 使用ShouldQueueWithoutChain改變了這個邏輯,為每個塊創建一個小的、易於排隊的作業。

如果您在本地使用數據庫隊列驅動程序進行測試,則很難發現此錯誤。 Laravel 作業可以是 4GB 左右。 您可以通過添加遷移將您的jobs.payload列從 LONGTEXT 更改為 TEXT 來接近此限制。 這會將作業大小限制設置為 64KB,這遠低於 SQS 限制,但對於捕獲鏈式作業來說是一個有效的金絲雀,這些鏈式作業對於 AWS 來說有太多的塊(假設您預計不需要排隊非常大的作業) .

設想
AWS docs發送數據到 SQS 隊列的硬限制是256KB 發生這種情況是因為我將 Collection object 發送到 SQS 隊列,並且每個 object 都有多個急切加載關系,因此 object 的大小變得太大。

AWS 解決方案
將集合 object 數組中的 id 傳遞給 SQS 隊列有助於解決Entity Too Large的問題。

Excel解決方案
Instead of using Laravel Excel I am using Laravel Storage append method to add rows to my csv file. 我已經測試了 50k 行,效果很好。 不要一次處理所有行,您可能會陷入 AWS timeout異常,我相信每個隊列15 minutes

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM