如何从Lambda批处理中失败特定的SQS消息?

时间:2019-04-03 14:42:26

标签: node.js amazon-web-services aws-lambda amazon-sqs

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

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

3 个答案:

答案 0 :(得分:1)

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

我建议做的是设置失败计数,这样,如果所有消息失败,您可以简单地为所有消息返回失败状态,否则,如果失败计数小于10,则可以将失败消息单独发回给队列。

答案 1 :(得分:0)

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

解决方案1:

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

解决方案2:

使用AWS StepFunction

StepFunction将调用lambda并在失败时处理重试逻辑,并在需要时提供可配置的指数补偿。

**解决方案3:**

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

给定事件源的错误处理取决于Lambda的调用方式。亚马逊的CloudWatch活动异步调用的lambda函数。

答案 2 :(得分:0)

您必须在成功处理每条消息后以编程方式将其删除。

因此,如果有任何一条消息失败,则可以将标志设置为true,并根据该标志在批量处理所有消息之后会引发错误,因此将根据重试策略删除成功的消息并重新处理其他消息