【问题标题】:Python: AWS Lambda to MySQL error catching/handlingPython:AWS Lambda 到 MySQL 错误捕获/处理
【发布时间】: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


    【解决方案1】:

    我确实有一些关于组织、调试和弹性的建议 - 请记住,我们正在对您的架构做出假设

    组织

    您目前有多个 从属 lambda 正在处理数据。当您有这样的处理流程时,您尝试处理的内容的复杂性决定了您是否需要使用编排工具。

    我建议通过 AWS Step Functions 编排你的 lambda

    调试

    在应用程序级别 - 记录任何不是 PII 的内容

    现在您正在使用编排工具,如果不满足下一步的条件,请适当地使用 Step Functions 的 error handling 以及应用程序中的任何业务逻辑到 error

    弹性

    生活发生了,事情破裂了,错误的代码被推送了

    设计您的编排以将您的 lambda 接收到的失败事件放入处理队列(AWS SQS、Kafka 等) - 您可以重新处理您的事件,或者如果事件有错误,则对它们进行 DLQ。

    这里有一个很好的article,关于在设计用例中使用编排 - 阅读一下

    【讨论】:

    • 非常感谢您的帮助和资源。我将深入研究这些。
    猜你喜欢
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    相关资源
    最近更新 更多