Amazon SQS如何处理不向同一服务的不同实例发送相同的消息?

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

我有一个队列(在这种情况下是Amazon SQS)并且有N个运行相同服务的节点正在消耗来自SQS的消息。

如何确保在任何时间点,不超过一个节点从队列中读取相同的消息。

对于Kafka,我们知道,可以将同一个使用者组中不超过一个使用者分配给单个主题分区。我们如何确保在Amazon SQS内部处理相同的事情?

message-queue distributed-computing amazon-sqs producer-consumer
1个回答
1
投票

用于防止将消息传递给多个消费者的亚马逊机制是Visibility Timeout

收到消息后,它立即保留在队列中。为了防止其他消费者再次处理消息,Amazon SQS设置了可见性超时,即Amazon SQS阻止其他消费者接收和处理消息的一段时间。消息的默认可见性超时为30秒。最小值为0秒。最长为12小时。

收到消息后,SQS会启动超时,并且在其持续时间内,它不会再将其发送给其他消费者。超时结束后,如果消息尚未删除,则SQS会再次为其他消费者提供该消息。

但正如笔记所说:

对于标准队列,可见性超时不能保证不会两次接收消息。有关更多信息,请参阅至少一次交付。

如果您只需要一次交货的绝对保证,您必须选择:

  1. 将您的应用程序设计为幂等的,以便在一次或多次处理相同的消息时结果相同。
  2. 尝试使用提供exactly once processing的SQS FIFO队列。
© www.soinside.com 2019 - 2024. All rights reserved.