我有一个队列(在这种情况下是Amazon SQS)并且有N个运行相同服务的节点正在消耗来自SQS的消息。
如何确保在任何时间点,不超过一个节点从队列中读取相同的消息。
对于Kafka,我们知道,可以将同一个使用者组中不超过一个使用者分配给单个主题分区。我们如何确保在Amazon SQS内部处理相同的事情?
用于防止将消息传递给多个消费者的亚马逊机制是Visibility Timeout:
收到消息后,它立即保留在队列中。为了防止其他消费者再次处理消息,Amazon SQS设置了可见性超时,即Amazon SQS阻止其他消费者接收和处理消息的一段时间。消息的默认可见性超时为30秒。最小值为0秒。最长为12小时。
收到消息后,SQS会启动超时,并且在其持续时间内,它不会再将其发送给其他消费者。超时结束后,如果消息尚未删除,则SQS会再次为其他消费者提供该消息。
但正如笔记所说:
对于标准队列,可见性超时不能保证不会两次接收消息。有关更多信息,请参阅至少一次交付。
如果您只需要一次交货的绝对保证,您必须选择: