Amazon SQS FIFO 队列

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

我们使用 AMAZON SQS FIFO 队列来处理我们应用程序的预约服务。一旦消息进入队列,它就会触发 Amazon Lambda 函数来管理预订流程。由于它是一个 FIFO 队列,因此我们确保如果 2 个人请求同一个槽位,则该槽位将分配给第一个请求者。我的问题是:有没有一种方法(可能是 SQS FIFO 队列中的设置?)确保一条消息在前一条消息完成执行之前不会触发 Amazon Lambda 函数。我只是想避免编写额外的逻辑(某种插槽锁定系统)的需要,以确保在第一次完成“预订”过程之前,同一个插槽不会被 2 个背对背消息定位。谢谢。

amazon-web-services amazon-sqs fifo
2个回答
2
投票

这是我解决问题的方法。

根本不建议使用SQS,并且您不需要SQS为您的用例提供的任何功能。

从 SQS 移至 Kinesis Data Streams 并将批量大小设置为 1 以触发 Lambda。这样就可以解决问题了。 Kinesis 流是一种 FIFO。此外,与事务性 FIFO SQS 队列相比,Kinesis 的扩展性非常好。

生产者 --> Kinesis Data Streams --> (Lambda 触发器 [批量大小为 1]) 拉姆达

考虑到错误情况,

处理错误:

如果您的 lambda 在处理流数据时失败,您的检查点将继续重试,重试次数不受限制。您需要确保修复您的 lambda 并使其继续前进。它将不断重试的总时间等于您配置数据在流上可用的总时间。

Lamda 中的错误:

如果 lambda 中有错误并且您想从流的开头返回,您可以这样做。

希望有帮助。


0
投票
[

对于未来的读者:在最初发布本文时,Lambda 似乎无法轮询 SQS FIFO 队列。现在他们可以了。另请注意:SQS FIFO 队列专为高吞吐量而设计,将批量大小设置为 1 会产生瓶颈。]

提问者所问的问题可以通过使用消息组 ID 来实现。当该消息组 ID 有正在发送的消息时,不会再发送具有特定消息组 ID 的消息。

这意味着,如果您使用 Lambda 处理 SQS FIFO 队列,那么您可以安全地利用 Lambda 的并发性。

在此处阅读更多相关信息:

https://aws.amazon.com/blogs/compute/solving-complex-ordering-challenges-with-amazon-sqs-fifo-queues/

另请参阅:

如何在 FIFO SQS 队列中完成批处理?

© www.soinside.com 2019 - 2024. All rights reserved.