【问题标题】:Clustered Architecture (node + ecs) Avoid Duplicated Queue Messages集群架构(node + ecs)避免重复的队列消息
【发布时间】:2021-04-23 10:02:16
【问题描述】:

我正在尝试设计一个健壮的架构,但是在解决消息传递问题时遇到了麻烦。 让我试着解释一下

API 将集群在 ECS 上接收大量请求。

Worker 也会聚集在一起订阅相同的频道。 (这就是问题所在,如果我们只与一名工人一起工作,那不会有任何问题)

如何处理多个工作人员避免重复消息? 什么是一个很好的简单方法,让许多工人忙着。

谢谢。

【问题讨论】:

  • 通常消息代理解决这个问题;例如,在 RabbitMQ 中,如果您有多个消费者在监听一个队列,他们都会收到消息,但他们通常只会处理每条消息一次(除非出现某种故障)。
  • 谢谢大卫,我发现这篇文章很有趣steves-internet-guide.com/mqttv5-shared-subscriptions .. 我不知道共享订阅。我还不确定共享订阅是否是我想要的。

标签: node.js docker architecture amazon-ecs messagebroker


【解决方案1】:

对于消息代理来说,这听起来像是一个非常基本的问题:拥有一个频道和多个订阅它的工作人员,并且所有这些工作人员都接收相同的消息。多次处理同一条消息实际上并没有什么用处。

大多数消息代理都解决了这个问题(我相信)。例如,当您使用来自 Amazon SQS 队列的消息时,该消息在特定时间范围 (visibility timeout) 内对其他消费者不可见。

当工作人员处理消息时,它必须将其从队列中删除。否则,如果超时超时,其他工作人员将看到该消息并对其进行处理。

特别是 SQS 具有分布式架构,有时您会在队列中获得 duplicate messages,它们由不同的工作人员处理。这就是 SQS 提供的at-least-once 交付保证的效果。

如果您的系统必须严格处理重复消息,那么您需要围绕它构建重复数据删除机制。

【讨论】:

    【解决方案2】:

    您正在寻找的关键字是“在分布式系统中完全保证一次”。有了它,您可以自己进行一些研究,但这里有一些指示。

    您可以使用支持“恰好一次”保证的正确事件队列系统。例如 Apache Pulsar(参见 link)或 Kafka,或者您可以在自己的实现中使用他们的方法作为灵感(这可能有点难以做到)。

    对于您自己的实现,您可以编写一个特殊的消费者,它是唯一的消费者,充当工作任务的分发者,其任务是保证“恰好一次”。这将是一种权衡,并且可能会成为瓶颈,具体取决于您的可扩展性要求。这个article 解释了为什么它在分布式系统中是一个难题。

    【讨论】: