我有一个严重的问题,我需要你的帮助。花费了大量的时间后,我无法在网上找到任何解决方案。
我做了一个机器人拿到这实在是繁重的任务,因为我需要设置一个刮板数据,然后经过许多步骤,提取网页数据(登录,注销,点击提交按钮,...),并得到这个结果后,它会发布到一个API来作报告。
我用的CloudWatch事件,使我的lambda函数在一定时间内每天运行。
问题是,虽然我在它的最高设置为我设置lambda函数(3GB RAM,15分钟超时,该指标是2019年1月),但有时我的lambda函数在执行时失败(也许刮任务花费太很多步骤或可能我试图刮掉的网页并不稳定),它很少会失败的,大约只有5%,我认为。
但我想知道是否有任何的方法来应对这种情况,我想我的lambda函数可以自动重试,当它失败而不做手工。
这是你可以把它定于CloudWatch的事件,而不是一个拉姆达一个StepFunction
完美的例子。
该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
}
}
}
你拉姆达已经重试,因为从CloudWatch的事件的触发是异步。 (请参见下面的文档),我会成立一个DLQ为您拉姆达,然后从那里再处理。
错误处理一个给定事件来源取决于LAMBDA如何调用。亚马逊的CloudWatch活动异步调用的lambda函数。有关错误是如何重试的详细信息,请参阅AWS LAMBDA重试行为。
和:(aws lambda retry behaviour)
异步调用 - 被用来调用lambda函数之前异步事件排队。如果AWS LAMBDA是无法完全处理该事件时,它会自动重试调用两次,重试之间的延迟。如果您已指定死信队列为你的函数,那么失败的事件被发送到指定的Amazon SQS队列或Amazon SNS主题。如果不指定死信队列(DLQ),这是不需要的,是默认设置,那么该事件将被丢弃。欲了解更多信息,请参阅AWS lambda函数死信队列。