2017-07-06 59 views
0

我正在构建一个系统,两个不同的实体需要处理来自同一个源的消息(以不同的方式 - 例如,一个会记录所有消息,而另一个实体可能需要聚合数据)。理想情况下,每个实体对于性能和弹性都是完全可扩展的,因此我们有多个发布者,多个日志订阅者和多个聚合订阅者,但每个发布的每个消息仍然由一个日志订阅者和一个聚合订阅者处理。NATS发布者可以将单个消息发送到多个队列吗?

通过AMQP,我们可以通过发布到扇出交换机来实现此目的,该交换机将消息分发到两个队列,其中每个队列拥有多个订阅者。我明白,通过简单地让所有订阅者在相同的“主题”上使用两个不同的“队列组名”基于他们的角色来监听,NATS可以实现相同的行为。

在这种情况下,到主题的消息将从每个队列组传送到一个用户,即每个消息将被准确传送n次,n是不同队列组的数量,而不是用户数量。它是否正确?

回答

3

事实上,你可以随时随地使用队列的用户(例如,它会是这样的API:func (nc *Conn) QueueSubscribe(subj, queue string, cb MsgHandler) (*Subscription, error)

queue是组名称。例如,它可以在你的榜样logaggregation你。可以建立在每一组中,只有1个成员各组在尽可能多的队列中的用户会收到一个给定的消息。

例如,假设您发布的主题foo一条消息,你有foo与队列10个的队列用户名称log和上的10个队列订户,队列名称为aggregation。该消息将传送给2位订户,1组为log,1组为aggregation

希望这会有所帮助。

0

你的方法是正确的,nats.io中的队列概念是在收听队列的用户之间顺序分发消息。这种分配以线性方式发生,假设你有10个用户(S1-S10)正在监听一个话题并在同一队列中注册,那么第一个消息将以循环方式发送到S1,然后发送到S2等等。

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

  1. 乒乓间隔
  2. 最大优秀ping请求

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

+0

你是说,如果一个用户崩溃,我们会丢失数据? – Guss

+0

如果订户脱机,那么nats服务器会在某个超时后知道此事件,在此超时期间,我们的情况可能会丢失数据。 – ritesh4302

相关问题