如何从Lambda中批量处理特定SQS消息?

问题描述 投票:0回答:2

我有一个带有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.'
    };
};

我是否必须手动将那些消息重新添加回队列?或者我可以从我的处理程序返回一个状态,指示一条消息失败并应该重试?

node.js amazon-web-services aws-lambda amazon-sqs
2个回答
1
投票

是的,您必须手动将失败的消息重新添加回队列。

我建议做的是设置失败计数,这样如果所有消息都失败,您只需返回所有消息的失败状态,否则如果失败计数<10,则可以单独将失败的消息发送回队列。


0
投票

您需要以不同的方式设计您的应用程序,这是一些不是最好的想法,但会解决您的问题。

解决方案1:

注意:当最初创建并启用SQS事件源映射时,或者首次出现在没有流量的时间段之后,Lambda服务将开始使用五个并行长轮询连接轮询SQS队列,根据AWS文档,默认持续时间从AWS Lambda到SQS的长期轮询是20秒。

解决方案2:

使用AWS步骤功能

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

**解决方案3:**

CloudWatch计划事件以触发轮询FAILED的Lambda函数。

给定事件源的错误处理取决于Lambda的调用方式。 Amazon CloudWatch Events异步调用您的Lambda函数。

© www.soinside.com 2019 - 2024. All rights reserved.