我正在建立一个系统,其中两个不同的实体需要处理来自同一来源的消息(以不同的方式 - 例如,一个将记录所有消息,而另一个实体可能想要聚合数据)。
理想情况下,每个实体都具有完全可扩展的性能和弹性,因此我们有多个发布者,多个日志订阅者和多个聚合订阅者,但每个发布的每个消息仍由一个日志订阅者和一个聚合订阅者处理。
使用AMQP,我们可以通过发布到扇出交换来实现这一点,该交换将消息分发到两个队列,其中每个队列都有许多订户。我理解,只需让所有订阅者都听同一个"主题"就可以在NATS中实现相同的行为。通过使用两个不同的"队列组名称"基于他们的角色。
在这种情况下,来自主题的消息将从每个队列组传递给一个订户,即每个消息将准确地传送n次,n是不同队列组的数量而不是订户的数量。这是对的吗?
答案 0 :(得分:3)
实际上,您可以使用队列订阅者(例如在Go中,它就是这样的API:func (nc *Conn) QueueSubscribe(subj, queue string, cb MsgHandler) (*Subscription, error)
。
queue
是组名。例如,它可以在您的示例log
和aggregation
中。您可以在每个组上创建任意数量的队列订阅者,每个组中只有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请求之后知道此事件,并且在该间隔期间它将转发消息到离线节点。因此,您需要仔细设置