coo*_*ire 6 amazon-s3 amazon-sqs amazon-web-services amazon-dynamodb aws-lambda
我有一个 fifo 队列,它触发 lambda 并且这个 fifo 队列没有其他消费者。
我希望我的 lambda 不会收到任何重复项,因为我确保我的消息具有 uniqueid 并且启用了基于内容的重复数据删除,以便没有重复项。但正如文档所说
Amazon SQS FIFO 队列确保处理顺序遵循消息组内的消息顺序。但是,当用作 Lambda 触发器时,它并不能保证仅交付一次。如果在您的无服务器应用程序中只有一次交付很重要,则建议使您的函数具有幂等性。您可以通过使用 Amazon DynamoDB 等可扩展的低延迟控制数据库跟踪消息的唯一属性来实现这一点。
这是否意味着即使启用了重复数据删除,我也会收到我的 lambda 副本,其中它是 fifo 队列的唯一使用者?
Bru*_*eis 12
这里有两件事在起作用,你似乎混合在一起。
一方面是 SQS的交付模式。使用 SQS FIFO 队列,您正确地注意到它启用了一次性交付。
另一方面,还有Lambda 函数的执行模型。执行模型是at-least-once。顺便说一下,这与任何并发设置无关。
Lambda 可能会多次执行一个函数有多种原因。最值得注意的是,Lambda 具有内置的重试功能,并且独立于 SQS FIFO 队列。根据可能发生的错误类型以及您的 Lambda 代码具有什么样的外部可观察副作用,您可能会看到您的代码针对单个实际调用多次运行。
也就是说,发送到 SQS FIFO 队列的消息最终可能会被 Lambda多次处理还有其他原因。例如,如果您的 Lambda 函数花费比队列或消息的 VisibilityTimeout 设置更长的时间来完成处理它收到的整个批次,那么所有这些消息将在队列中再次变为可见,并且您的 Lambda 函数的另一次调用将(当然,不仅仅是“可能”)再次收到这些消息。
所以底线是:您需要在 Lambda 中编写幂等代码 - 不是因为 SQS FIFO(它确实允许防止重复交付),而是因为 Lambda 重试和消息在队列中再次变得可见的可能性由于处理缓慢(它总是至少一次执行模型)。
| 归档时间: |
|
| 查看次数: |
1131 次 |
| 最近记录: |