【发布时间】:2022-02-12 13:03:39
【问题描述】:
我有两个用 Python 编写的 Lambda 函数:
Lambda 函数 1:从 API 获取“新”数据,从 S3 存储桶(如果存在)获取“旧”数据,比较新旧数据并创建 3 个不同的字典列表:插入、更新和删除.每个列表通过使用RequestResponse 的 Lambda 调用分批 (~6MB) 传递给下一个 lambda 函数。完整数据集的大小可能从数百万条记录到 1 或 2 条不等。
Lambda 函数 2:分别处理每种类型的数据(插入、更新、删除) - 每种类型都会发生特定的事情,但最终每个批次都使用 pymysqlexecutemany 写入 MySQL。
我想不出处理错误的最佳方法。例如,假设一个正在写入的批次包含一个记录,该记录具有一个字段的 NULL 值,该字段在数据库中不允许为 NULL。整个批次都失败了,我无法弄清楚哪些内容写入了数据库,哪些内容不适合该批次。理想情况下,会触发通知,并将 rouge 记录写入可以人工审核的地方 - 所有其他记录都将成功写入
理想情况下,我可以使用Kinesis Firehose 中的Bisect Batch on Function Failure 之类的东西。它将递归地将失败的批次拆分为更小的批次并重试它们,直到它隔离了有问题的记录。如果已配置,这些将被发送到 DLQ。但是,我不认为Kenesis Firehose 对我有用,因为它不写入 RDS,因此不知道哪些记录失败。
如果executemany 失败,此人https://stackoverflow.com/a/58384445/6669829 建议使用execute。不确定这是否适用于大批量。但也许如果我从 S3 中 stream the data 而不是通过 RequestResponse 调用这可以工作吗?
这个article(AWS Lambda 批处理)讨论了从 Lambda 到 SQS 到 Lambda 到 RDS,但我不确定在这种情况下您可以如何具体地处理错误。您必须一次发送一条记录吗?
这个blog 使用了类似的东西,但我仍然不确定如何根据我的用例调整它,或者这是否是最好的解决方案。
以我能得到的任何形式寻求帮助;想法、博客文章、教程、视频等。
谢谢!
【问题讨论】:
标签: python mysql aws-lambda amazon-rds amazon-sqs