我有一个fifo队列,它对其触发了lambda触发,并且此fifo队列没有其他使用者。
我希望我的lambda不会收到任何重复,为此,我确保我的邮件具有唯一标识,并且已启用基于内容的重复数据删除,以确保没有重复。但是正如文档所述
Amazon SQS FIFO队列确保处理顺序遵循消息组内的消息顺序。但是,当用作Lambda触发器时,它不能保证仅一次交付。如果在无服务器应用程序中仅一次交付很重要,则建议使功能成为幂等。您可以通过使用可扩展的低延迟控制数据库(例如Amazon DynamoDB)跟踪消息的唯一属性来实现此目的。
这是否意味着即使启用了重复数据删除功能,我也将收到lambda的副本,而lambda却是fifo队列的唯一使用者?
[这里似乎有两件事正在发生,您似乎混在一起。
一方面是SQS的交付模型。对于SQS FIFO队列,您正确地注意到它启用了[[一次]]传递。
Lambda函数的执行模型
将
(当然,不仅仅是“可能”)再次收到这些消息。因此,最重要的是:您需要在Lambda中编写幂等代码-不是因为SQS FIFO(它确实可以防止重复发送),而是因为Lambda重试以及消息再次出现的可能性由于处理速度慢而导致排队(它总是最少一次执行模型)。
即使您只有一个lambda函数作为使用者,也取决于lambda函数上的并发设置,可以有多个调用。这意味着在给定的时间,多个调用可以选择SQS队列中的消息。