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

时间:2017-07-06 11:48:37

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

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

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

使用AMQP,我们可以通过发布到扇出交换来实现这一点,该交换将消息分发到两个队列,其中每个队列都有许多订户。我理解,只需让所有订阅者都听同一个"主题"就可以在NATS中实现相同的行为。通过使用两个不同的"队列组名称"基于他们的角色。

在这种情况下,来自主题的消息将从每个队列组传递给一个订户,即每个消息将准确地传送n次,n是不同队列组的数量而不是订户的数量。这是对的吗?

2 个答案:

答案 0 :(得分:3)

实际上,您可以使用队列订阅者(例如在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

希望这有帮助。

答案 1 :(得分:0)

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

您只需要确保所有订阅者都连接到服务器,就像一个潜在客户离线一样,nats服务器会在某些未完成的PING-PONG请求之后知道此事件,并且在该间隔期间它将转发消息到离线节点。因此,您需要仔细设置

  1. PING-PONG间隔
  2. 最多未完成的PING请求
  3. https://nats.io/documentation/server/gnatsd-config/