SQS消费者在消息可见性超时期间可以收到重复的消息吗?

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

我正在使用 SQS 标准队列构建一个应用程序,当队列中有新消息时,它将触发 Lambda 函数。我知道我的 Lambda 函数可能会收到之前处理过的重复消息:

在极少数情况下,当您接收或删除消息时,存储消息副本的服务器之一可能不可用。如果发生这种情况,该消息的副本不会在该不可用的服务器上删除,并且您在收到消息时可能会再次获得该消息副本。

根据我的理解,Lambda 服务将启动 Lambda 函数的多个实例,并且 Lambda 函数的不同实例可能会处理相同的消息。但根据开发者指南,

收到消息后,该消息立即保留在队列中。为了防止其他使用者再次处理该消息,Amazon SQS 设置可见性超时,即 Amazon SQS 阻止其他使用者接收和处理该消息的一段时间。

我想知道我的 Lambda 函数的一个实例是否可能收到重复的消息,而我的 Lambda 函数的另一个实例仍在处理该消息。也就是说,我想知道当消息可见性超时时,一个 Lambda 实例是否可以接收该消息。

提前谢谢您。

amazon-web-services aws-lambda amazon-sqs
1个回答
0
投票

阅读这些文档后...

不,如果它仍在处理消息,那么它不能,但如果处理失败,那么它可能。在我看来,这取决于消息的数量和批次。

Lambda 批量读取消息并为每个批次调用一次您的函数。当您的函数成功处理一批时,Lambda 将从队列中删除其消息。

  1. 这证实了 lambda 的并发性取决于批处理的事实。

当 Lambda 读取批次时,消息保留在队列中,但在队列可见性超时时间内隐藏。如果您的函数成功处理该批处理,Lambda 将从队列中删除消息。默认情况下,如果您的函数在处理批次时遇到错误,该批次中的所有消息将再次在队列中可见。

  1. 这确定了应处理批次中的所有消息的事实,否则它们将在队列中可见。

对于标准队列,Lambda 使用长轮询来轮询队列,直到其变为活动状态。当消息可用时,Lambda 最多读取五个批次并将它们发送到您的函数。如果消息仍然可用,Lambda 会将每分钟读取批次的进程数量增加最多 60 个实例。事件源映射可以同时处理的最大批次数为 1,000。

  1. 这表明单个 lambda 最多可以读取 5 个批次。

结合所有 3 个。

如果最多 5 个批次,则单个 lambda 可以处理 5 个批次,如果超过 5 个批次,将调用多个 lambda,此时如果前一个 lambda 无法处理消息,并且它会重新出现在队列中,并且新调用的 lambda 将能够读取之前无法处理的消息。

这篇博客文章也比文档更好地解释了这一点:https://data.solita.fi/lessons-learned-from-combining-sqs-and-lambda-in-a-data-project/

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