NATS 发布者可以将单个消息发送到多个队列吗?

Can a NATS publisher send a single message into multiple queues?

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

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

使用 AMQP,我们可以通过发布到扇出交换来实现这一点,该交换将消息分发到两个队列,每个队列都有许多订阅者。我知道在 NATS 中可以实现相同的行为,只需让所有订阅者根据他们的角色使用两个不同的 "queue group names" 收听相同的 "subject"。

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

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

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

例如,假设您在主题 foo 上发布了一条消息,您在 foo 上有 10 个队列订阅者,队列名称为 log,在 [=14= 上有 10 个队列订阅者] 队列名称 aggregation。消息将传递给 2 个订阅者,1 个用于组 log,1 个用于组 aggregation

希望这对您有所帮助。

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

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

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

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