我有一个将从 SQS 队列中使用的服务,并且该服务的多个实例将在 EC2 或 Kubernetes Pod 上并行运行,以避免单点故障,现在我的队列是 FIFO 队列,我想在以下情况下保留顺序:消息并处理一次。现在我的应用程序的每个实例都将有一个 SQS 消费者。假设队列 m1 和 m2 中有 2 个消息,以及 2 个消费者 c1 和 c2,如果 c1 接收 m1,并且 c2 接收 m2 并且 c2 在 m1 可以被 c1 处理之前处理 m2,这会给我带来一个问题,是在拥有多个消费者的情况下有什么方法可以避免这种情况
我需要知道是否有办法在有多个消费者时保留订单,或者可能用其他服务替换 SQS 来实现我的目标
当消息发送到 Amazon SQS FIFO 队列时,发送者会提供一个
MessageGroupId
来标识消息“组”。
例如,想象一下一群公交车在城市中行驶。每辆公交车每隔几分钟就会将其位置发送到队列中。
MessageGroupId
包含总线标识符。 按顺序使用来自每辆公交车的消息非常重要,否则地图可能会显示公交车在地图上倒退。
为了实现这一点,先进先出队列将执行以下操作:
MessageGroupId
)的消息。它可能提供来自同一组的多条消息。这意味着 Consumer-2 可能会处理一些在来自总线 1 的消息之后收到的“稍后”消息(例如来自总线 3)。这没关系,因为来自给定总线的所有消息将始终按顺序处理。
因此,可以将 FIFO 队列视为实际上有许多“迷你队列”,每个队列都有不同的
MessageGroupId
。当一个 Group 的消息正在处理时,Consumer 可以继续处理来自不同 Group 的消息。
如果您的特定情况只需要一组必须严格按顺序处理的消息,那么后续消费者将不会收到任何消息,直到现有消费者完成处理来自该组的消息。在这种情况下,不可能并行处理消息。