当用作Lambda触发器时,SQS fifo队列不能确保一次性交付

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

我有一个fifo队列,它对其触发了lambda触发,并且此fifo队列没有其他使用者。

我希望我的lambda不会收到任何重复,为此,我确保我的邮件具有唯一标识,并且已启用基于内容的重复数据删除,以确保没有重复。但是正如文档所述

Amazon SQS FIFO队列确保处理顺序遵循消息组内的消息顺序。但是,当用作Lambda触发器时,它不能保证仅一次交付。如果在无服务器应用程序中仅一次交付很重要,则建议使功能成为幂等。您可以通过使用可扩展的低延迟控制数据库(例如Amazon DynamoDB)跟踪消息的唯一属性来实现此目的。

这是否意味着即使启用了重复数据删除功能,我也将收到lambda的副本,而lambda却是fifo队列的唯一使用者?

amazon-web-services amazon-s3 aws-lambda amazon-dynamodb amazon-sqs
2个回答
2
投票

[这里似乎有两件事正在发生,您似乎混在一起。

  • 一方面是SQS的交付模型。对于SQS FIFO队列,您正确地注意到它启用了[[一次]]传递。

  • 另一方面,有

    Lambda函数的执行模型

  • 。执行模型为至少一次。顺便说一下,这与任何并发设置无关。Lambda可能多次执行一个函数有多个原因。最值得注意的是,Lambda具有独立于SQS FIFO队列的内置重试功能。根据可能发生的错误类型以及Lambda代码具有什么样的外部可观察到的副作用,您可能会看到您的代码对于一次实际调用而言会运行多次。
也就是说,还有其他原因导致发送到SQS FIFO队列的消息可能最终被Lambda处理多次。例如,如果您的Lambda函数花费比队列或消息的VisibilityTimeout设置更长的时间来完成对接收到的整个批处理的处理,则所有这些消息将在队列中再次变为可见,并再次调用Lambda函数

(当然,不仅仅是“可能”)再次收到这些消息。

因此,最重要的是:您需要在Lambda中编写幂等代码-不是因为SQS FIFO(它确实可以防止重复发送),而是因为Lambda重试以及消息再次出现的可能性由于处理速度慢而导致排队(它总是最少一次执行模型)。

即使您只有一个lambda函数作为使用者,也取决于lambda函数上的并发设置,可以有多个调用。这意味着在给定的时间,多个调用可以选择SQS队列中的消息。


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.