我有一个带有SQS触发器的Lambda。当它被击中时,来自SQS的一批记录进来(我认为通常一次大约10个)。如果我从处理程序返回失败的状态代码,则将重试所有10条消息。如果我返回成功代码,它们将全部从队列中删除。如果这10条消息中有1条失败并且我想重试那条消息怎么办?
exports.handler = async (event) => {
for(const e of event.Records){
try {
let body = JSON.parse(e.body);
// do things
}
catch(e){
// one message failed, i want it to be retried
}
}
// returning this causes ALL messages in
// this batch to be removed from the queue
return {
statusCode: 200,
body: 'Finished.'
};
};
我是否必须手动将那些消息重新添加回队列?或者我可以从我的处理程序返回一个状态,指示一条消息失败并应该重试?
是的,您必须手动将失败的消息重新添加回队列。
我建议做的是设置失败计数,这样如果所有消息都失败,您只需返回所有消息的失败状态,否则如果失败计数<10,则可以单独将失败的消息发送回队列。
您需要以不同的方式设计您的应用程序,这是一些不是最好的想法,但会解决您的问题。
解决方案1:
注意:当最初创建并启用SQS事件源映射时,或者首次出现在没有流量的时间段之后,Lambda服务将开始使用五个并行长轮询连接轮询SQS队列,根据AWS文档,默认持续时间从AWS Lambda到SQS的长期轮询是20秒。
解决方案2:
使用AWS步骤功能
如果需要,StepFunction将调用lambda并在失败时处理重试逻辑,并使用可配置的指数退避。
**解决方案3:**
CloudWatch计划事件以触发轮询FAILED的Lambda函数。
给定事件源的错误处理取决于Lambda的调用方式。 Amazon CloudWatch Events异步调用您的Lambda函数。