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

时间:2019-04-01 11:53:17

标签: message-queue distributed-computing amazon-sqs producer-consumer

我有一个队列(在本例中为Amazon SQS),并且有N个运行相同服务的节点正在使用来自SQS的消息。

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

对于Kafka,我们知道,不能将来自同一消费者组的一个消费者分配给单个主题分区。我们如何确保在Amazon SQS内部处理相同的事情?

1 个答案:

答案 0 :(得分:1)

阻止消息传递给多个使用者的亚马逊机制是Visibility Timeout

  

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

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

但是如注释所示:

  

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

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

  1. 将您的应用程序设计为幂等的,以使结果是 如果一次或多次处理相同的消息,则相同。
  2. 尝试 使用提供exactly once processing的SQS FIFO队列。