提问者:小点点

具有可见性超时扩展的SQS Lambda触发器


我正在研究一个解决方案,其中我有一个带有Lambda触发器的SQS队列。我的理解是Lambda将成批接收待处理的消息,一旦Lambda功能成功,SQS队列中的消息将自动删除。但是,我如何只允许删除其中的一些邮件?

让我们假设这样一个用例:Lambda函数接收一个包含10条消息的批处理,只有7条消息是有效的并且可以被处理,另外3条消息需要在稍后的时间点被重新处理。

我最初的想法是,我可以通过< code > boto 3 . sqs . change _ visibility _ time out 为3个消息中的每一个更新可见性超时,以便在超时后重新处理它,但是,由于整个lambda函数执行成功,所有10个消息都从SQS队列中删除。

有什么建议吗?


共2个答案

匿名用户

是的,默认情况下,Lambda函数会在成功后删除所有消息。您需要在代码中处理此问题,但不需要更改消息的可见性超时。

添加 DLQ(死信队列),该队列将实际处理失败的消息(消息在处理一定次数的失败尝试后转到 DLQ,具体取决于您的设置方式)

这里你有几个选择:

    < li >您可以自己处理每个项目,并删除成功处理的消息。如果消息不成功,您可以抛出一个错误,它不会被lambda函数自动删除 < li >如果您使用JavaScript,可以尝试Middy < li >如果您使用Python,您可以使用Lambda Powertools Python

匿名用户

对于带有SQS触发器的AWS Lambdas,默认情况下,当您的函数在处理给定批处理中的一条或多条消息时遇到错误,整个批处理都会被标记为失败。批处理中的所有消息在队列中再次可见。根据您的重新驱动策略,您可能会重复处理成功的消息和失败的消息。

与更改可见性超时不同,指定哪些消息应该稍后重试以及哪些消息可以安全地从队列中删除的最简单方法是将函数响应类型更改为ReportBatchItemFailures。这允许您返回失败消息ID的列表,指示只有批处理中的那些消息应该在队列中再次可见。

下面是Node.js中处理函数的报告语法:

exports.handler = async (event) => {
    // Process the event
    const batchItemFailureResponse = {
        batchItemFailures: [
            {
                itemIdentifier: "idFailedMessage1"
            },
            {
                itemIdentifier: "idFailedMessage2"
            },
            {
                itemIdentifier: "idFailedMessage3"
            }
        ]
    };
    return batchItemFailureResponse;
};

更多信息可在官方文档中找到。

此响应类型在将队列设置为Lambda的事件源时配置。如果要从控制台进行配置,请导航到Lambda功能页,选择Configuration(配置)选项卡,然后选择Triggers(触发器)。然后选择添加触发器并选择SQS触发器类型。除了提供标准参数外,请确保在展开“其他设置”后选中“报告批处理项目失败”下的复选框。它应该看起来像这样:

添加带有批量失败报告的触发器

首次创建触发器时,必须设置该参数。

如果您使用CloudFormation模板配置资源,也可以定义此响应类型。有关更多信息,请参阅AWS文档。注意,如果使用AWS SAM事件源映射,文档建议不支持将FunctionResponseTypes添加到类型列表中带有ReportBatchItemFailures的YAML。这是不正确的,文档只是过时了。在解决这一监督方面存在一个公开的问题。

最后,除了报告批处理项失败之外,您还应该配置目标DLQ(死信队列)并确定合理的最大接收计数,以便可以对反复失败的消息采取行动。