当AWS lambda函数超时时重试的最佳解决方案



我有一个严重的问题,需要你的帮助。在花了很多时间之后,我在网上找不到任何解决方案。

我做了一个机器人程序来获取数据,这是一项非常艰巨的任务,因为我需要设置一个scraper,然后它通过许多步骤(登录、注销、点击、提交按钮等)从网页中提取数据,得到这个结果后,它会发布到API上进行报告。

我使用Cloudwatch事件使我的lambda函数每天在特定时间运行。

问题是,尽管我将lambda函数设置为最大设置(3GB RAM和15分钟超时,指标在2019年1月),但有时我的lambda函数在执行时失败了(可能是抓取任务花费了太多步骤,也可能是我尝试抓取的网页不稳定),它很少失败,我认为只有5%。

但我想知道是否有任何方法可以处理这种情况,我希望我的lambda函数可以在失败时自动重试,而无需手动操作。

这是StepFunction的一个完美例子,您可以通过CloudWatch Event而不是lambda对其进行调度。

StepFunction可以调用您的lambda,并在失败时处理重试逻辑,如果需要,可以配置指数回退。

下面是一个StepFunction 的例子

{
"Comment": "Call lambda with retry",
"StartAt": "Scraper",
"States": {
"Scraper": {
"Type": "Task",
"Resource": "<LAMBDA_ARN>",
"Retry": [
{
"ErrorEquals": [
"States.ALL"
],
"IntervalSeconds": 20,
"MaxAttempts": 5,
"BackoffRate": 2
}
],
"End": true
}
}
}

您的lambda已经重试,因为cloudwatch事件的触发器是异步的。(请参阅下面的文档)我会为您的lambda设置一个DLQ,然后从那里重新处理。

来自文档(aws-lambda事件源)

给定事件源的错误处理取决于Lambda的调用方式。Amazon CloudWatch Events异步调用Lambda函数。有关如何重试错误的更多信息,请参阅AWS Lambda重试行为。

和:(aws lambda重试行为)

异步调用–异步事件在用于调用Lambda函数之前会排队。如果AWS Lambda无法完全处理该事件,它将自动重试两次调用,两次重试之间会有延迟。如果您为函数指定了死信队列,则失败事件将发送到指定的Amazon SQS队列或Amazon SNS主题。如果您没有指定死信队列(DLQ)(这不是必需的,并且是默认设置),则该事件将被丢弃。有关更多信息,请参阅AWS Lambda函数死信队列。

尽管已经给出了答案,但在本文中,我将解释这个问题,并分享一个处理lambdas的步骤函数示例。

具有阶跃函数的Lambdas

最新更新