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