我有一个带有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.'
};
};
我是否必须手动将那些消息重新添加到队列中?还是我可以从处理程序返回状态,指示一条消息失败,应该重试?
答案 0 :(得分:1)
是的,您必须手动将失败的消息重新添加到队列中。
我建议做的是设置失败计数,这样,如果所有消息失败,您可以简单地为所有消息返回失败状态,否则,如果失败计数小于10,则可以将失败消息单独发回给队列。
答案 1 :(得分:0)
您需要以不同的方式设计应用程序,这里的想法不是最好的,但可以解决您的问题。
解决方案1:
如果消息在sq1中失败,则现在在lambda函数内部,然后在sq1上将其删除,然后在sq2上将其删除以进行重试。在丢弃事件之前,将重试两次异步调用的Lambda函数。如果重试失败。
如果在重试后再次失败,则进入死信队列sdl。
注意:当最初创建并启用SQS事件源映射或在没有流量的时间段后首次出现SQS事件源映射时,根据AWS文档,Lambda服务将开始使用五个并行的长轮询连接来轮询SQS队列,从AWS Lambda到SQS进行长时间轮询的默认持续时间为20秒。
解决方案2:
使用AWS StepFunction
StepFunction将调用lambda并在失败时处理重试逻辑,并在需要时提供可配置的指数补偿。
**解决方案3:**
CloudWatch计划的事件可触发轮询FAILED的Lambda函数。
给定事件源的错误处理取决于Lambda的调用方式。亚马逊的CloudWatch活动异步调用的lambda函数。
答案 2 :(得分:0)
您必须在成功处理每条消息后以编程方式将其删除。
因此,如果有任何一条消息失败,则可以将标志设置为true,并根据该标志在批量处理所有消息之后会引发错误,因此将根据重试策略删除成功的消息并重新处理其他消息