AWS SQS:多个lambda函数工作人员是否会从多个服务器中提取单个消息的副本?

时间:2018-07-27 13:21:25

标签: amazon-web-services aws-lambda amazon-sqs

根据AWS文档, https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/standard-queues.html#standard-queues-at-least-once-delivery

Amazon SQS stores copies of messages on multiple servers for redundancy and high availability.

我的案子: 我已经将我的标准队列与lambda函数集成在一起。每当有新消息到达队列时,lambda函数都会被调用。 由于AWS Lambda将根据队列大小继续增加并发函数执行的次数, 如果据此我的队列大小为1000,则lambda函数的并发执行次数也会增加。在那种情况下,是否有可能多个工作人员通过一次从多个服务器接收来处理同一个消息副本?

我遇到了一个问题: AWS: multiple instances reading SQS 但是我没有找到将消息副本存储在多个服务器上的概念。

3 个答案:

答案 0 :(得分:0)

即使Lambda函数的单个实例也可能会收到重复的消息。 SQS尽最大努力仅发送一次消息,但不做任何保证。如果要保证仅将消息传递一次,则需要使用SQS FIFO队列,但是这些队列目前不支持Lambda触发器。

答案 1 :(得分:0)

某些代码接收到相同消息的可能性是由于ReceiveMessage调用可能同时发生,并可能击中单独的SQS服务器。

虽然没有记录,但我怀疑从SQS队列触发Lambda函数的机制(这是很新的)不会具有此行为,因为AWS负责触发Lambda,而不是外部流程调用SQS。

但是,没有文档来确认它是否会发生。

答案 2 :(得分:0)

标准队列可以传递重复的消息。您发布的问题是每个人在使用jms或任何其他队列消息传递时都会遇到的标准消息传递队列问题。我们也遇到了类似的情况,即目标服务中使用ECS而不是lambda。我们正在使用unique identifier in database检查提交状态,以验证消息是否被其他节点处理。

FIFO可能是解决您的问题的选择,但是当前lambda函数不支持它。