Laravel Vapor+DynamoDB队列任务处理120MB JSONFeed遇413错误求助
Laravel Vapor处理大体积JSON数据同步的解决方案(针对DynamoDB 413错误)
问题根源
DynamoDB单条PutItem请求的payload上限为400KB,同时Lambda队列任务的负载限制是256KB,120MB的产品数据远超出这些阈值,直接触发了413请求过大错误。
解决方案
拆分数据为极小批次
不要直接处理整个120MB JSON,把产品数据拆成单条或10条以内的小批次(确保序列化后大小控制在200KB以内),每个批次单独触发队列任务。
示例代码:// $products为解析后的完整产品数组 collect($products)->chunk(5)->each(function ($chunk) { ProcessProductBatch::dispatch($chunk); });用S3存储原始数据,队列仅传路径
先把从供应商拿到的120MB JSON上传到AWS S3(Vapor默认集成S3,无需额外配置),队列任务只接收S3文件路径,在任务内部从S3读取并逐块解析处理。
示例代码:// 上传JSON到S3 $s3Path = 'product-data/'.uniqid().'.json'; Storage::disk('s3')->put($s3Path, $rawJsonData); // 触发队列任务 ProcessProductFromS3::dispatch($s3Path); // 队列任务逻辑 class ProcessProductFromS3 implements ShouldQueue { public function __construct(public string $s3Path) {} public function handle() { $jsonContent = Storage::disk('s3')->get($this->s3Path); $products = json_decode($jsonContent, true); // 拆分批次写入DynamoDB... } }改用DynamoDB批量写入API
用BatchWriteItem替代PutItem,单次最多可写入25条项目(总大小不超16MB),减少请求次数同时控制单请求大小。Laravel Eloquent会自动处理底层调用:Product::insert($chunk); // 底层自动使用BatchWriteItem调整Lambda内存配置(可选)
更高的Lambda内存分配会提升临时存储(/tmp目录最大可达10GB),方便任务内部缓存拆分后的数据块。在vapor.yml中修改:environments: staging: memory: 2048
内容的提问来源于stack exchange,提问作者rkaalma
相关产品推荐
相关产品推荐

