我们使用 AMAZON SQS FIFO 队列来处理我们应用程序的预约服务。一旦消息进入队列,它就会触发 Amazon Lambda 函数来管理预订流程。由于它是一个 FIFO 队列,因此我们确保如果 2 个人请求同一个槽位,则该槽位将分配给第一个请求者。我的问题是:有没有一种方法(可能是 SQS FIFO 队列中的设置?)确保一条消息在前一条消息完成执行之前不会触发 Amazon Lambda 函数。我只是想避免编写额外的逻辑(某种插槽锁定系统)的需要,以确保在第一次完成“预订”过程之前,同一个插槽不会被 2 个背对背消息定位。谢谢。
这是我解决问题的方法。
我根本不建议使用SQS,并且您不需要SQS为您的用例提供的任何功能。
从 SQS 移至 Kinesis Data Streams 并将批量大小设置为 1 以触发 Lambda。这样就可以解决问题了。 Kinesis 流是一种 FIFO。此外,与事务性 FIFO SQS 队列相比,Kinesis 的扩展性非常好。
生产者 --> Kinesis Data Streams --> (Lambda 触发器 [批量大小为 1]) 拉姆达考虑到错误情况,
处理错误:
如果您的 lambda 在处理流数据时失败,您的检查点将继续重试,重试次数不受限制。您需要确保修复您的 lambda 并使其继续前进。它将不断重试的总时间等于您配置数据在流上可用的总时间。
Lamda 中的错误:
如果 lambda 中有错误并且您想从流的开头返回,您可以这样做。希望有帮助。
对于未来的读者:在最初发布本文时,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/
另请参阅: