【问题标题】:Can a NATS publisher send a single message into multiple queues?NATS 发布者可以将单个消息发送到多个队列吗?
【发布时间】:2017-12-10 09:49:31
【问题描述】:

我正在构建一个系统,其中两个不同的实体需要处理来自同一来源的消息(以不同的方式 - 例如,一个实体将记录所有消息,而另一个实体可能想要聚合数据)。

理想情况下,每个实体在性能和弹性方面都是完全可扩展的,因此我们有多个发布者、多个日志订阅者和多个聚合订阅者,但每个发布者生成的每条消息仍然只由一个日志订阅者和一个聚合订阅者处理。

使用 AMQP,我们可以通过将消息发布到扇出交换器来实现此目的,该交换器将消息分发到两个队列,每个队列都有许多订阅者。我知道在 NATS 中可以实现相同的行为,只需让所有订阅者根据其角色使用两个不同的“队列组名称”来监听相同的“主题”。

在这种情况下,发送到主题的消息将从每个队列组传递给一个订阅者,即每条消息将被准确传递 n 次,n 是不同队列组的数量,而不是订阅者的数量。这是正确的吗?

【问题讨论】:

    标签: message-queue messaging publish-subscribe nats.io


    【解决方案1】:

    确实,您可以使用队列订阅者(例如在 Go 中,它会是这样的 API:func (nc *Conn) QueueSubscribe(subj, queue string, cb MsgHandler) (*Subscription, error)

    queue 是组名。例如,在您的示例中可能是 logaggregation。您可以在每个组上创建尽可能多的队列订阅者,并且每个组中只有 1 个成员会收到给定的消息。

    例如,假设您在主题 foo 上发布了一条消息,并且您在 foo 上有 10 个队列订阅者,队列名称为 log,在 foo 上有 10 个队列订阅者,队列名称为 aggregation。消息将发送给 2 个订阅者,1 个用于群组log,1 个用于群组aggregation

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      您的方法是正确的,nats.io 中队列的概念是在侦听队列的订阅者之间顺序分发消息。这种分布以线性方式发生,假设您有 10 个订阅者(S1-S10)正在监听一个主题并在同一个队列上注册,那么第一条消息将被发送到 S1,然后以循环方式发送到 S2,依此类推。

      您只需要确保所有订阅者都连接到服务器,就像订阅者下线一样,NATS 服务器将在某些未完成的 PING-PONG 请求后意识到此事件,并在此时间间隔内转发消息到离线节点。因此需要谨慎设置

      1. 乒乓间隔
      2. 最大未完成的 PING 请求数

      https://nats.io/documentation/server/gnatsd-config/

      【讨论】:

      • 你是说如果订阅者崩溃,我们就会丢失数据?
      • 如果订阅者下线,那么 nats 服务器会在一定的超时后知道这个事件,在我们的例子中,在这个超时期间可能会丢失数据。
      猜你喜欢
      • 2012-04-18
      • 2010-11-05
      • 2014-10-12
      • 2013-11-15
      • 2011-12-07
      • 2016-12-10
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      相关资源
      最近更新 更多