当我的用例限制我按创建顺序处理消息且只能处理一次消息时,SQS FIFO 队列是否可以有多个使用者?

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

我有一个将从 SQS 队列中使用的服务,并且该服务的多个实例将在 EC2 或 Kubernetes Pod 上并行运行,以避免单点故障,现在我的队列是 FIFO 队列,我想在以下情况下保留顺序:消息并处理一次。现在我的应用程序的每个实例都将有一个 SQS 消费者。假设队列 m1 和 m2 中有 2 个消息,以及 2 个消费者 c1 和 c2,如果 c1 接收 m1,并且 c2 接收 m2 并且 c2 在 m1 可以被 c1 处理之前处理 m2,这会给我带来一个问题,是在拥有多个消费者的情况下有什么方法可以避免这种情况

我需要知道是否有办法在有多个消费者时保留订单,或者可能用其他服务替换 SQS 来实现我的目标

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

当消息发送到 Amazon SQS FIFO 队列时,发送者会提供一个

MessageGroupId
来标识消息“组”。

例如,想象一下一群公交车在城市中行驶。每辆公交车每隔几分钟就会将其位置发送到队列中。

MessageGroupId
包含总线标识符。 按顺序使用来自每辆公交车的消息非常重要,否则地图可能会显示公交车在地图上倒退。

为了实现这一点,先进先出队列将执行以下操作:

  • Consumer-1 从队列中请求一些消息。 SQS 将提供来自任何总线(即任何
    MessageGroupId
    )的消息。它可能提供来自同一组的多条消息。
  • 当消费者处理消息时,这些消息将变得“不可见”。这样做是为了防止消费者失败,在这种情况下,消息稍后将重新出现在队列中。
  • 假设 Consumer-2 请求一些消息,而 Consumer-1 仍在处理其消息。 SQS 不会向 Consumer-2 提供属于 Consumer-1 当前正在处理的任何消息组 ID 的任何消息。这可确保消息按照正确的顺序进行处理。例如,如果 Consumer-1 正在处理总线 1 和总线 2 的消息,则 SQS 将不会向 Consumer-2 提供来自总线 1 或总线 2 的任何消息。

这意味着 Consumer-2 可能会处理一些在来自总线 1 的消息之后收到的“稍后”消息(例如来自总线 3)。这没关系,因为来自给定总线的所有消息将始终按顺序处理。

因此,可以将 FIFO 队列视为实际上有许多“迷你队列”,每个队列都有不同的

MessageGroupId
。当一个 Group 的消息正在处理时,Consumer 可以继续处理来自不同 Group 的消息。

如果您的特定情况只需要一组必须严格按顺序处理的消息,那么后续消费者将不会收到任何消息,直到现有消费者完成处理来自该组的消息。在这种情况下,不可能并行处理消息。

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