Rabbitmq:发布者在Nodejs amqplib中确认

问题描述 投票:0回答:1

我正在使用amqplib作为nodejs rmq客户端。我正在使用ConfirmChannel发布带有强制标志集的消息。

Rabbitmq / Amqplib在一条消息发布到具有两个队列的主题交换时,没有在通道上提供return,其中具有队列的节点之一已终止。

根据Documentation

For unroutable messages, the broker will issue a confirm once the exchange verifies a message won't route to any queue (returns an empty list of queues). If the message is also published as mandatory, the basic.return is sent to the client before basic.ack. The same is true for negative acknowledgements (basic.nack).

没有要发送的队列时,将触发return。并且当两个队列都存在时,将接收到ack

但是在发布过程中,如果其中一个节点被终止,则其中一个队列已终止,我预计会发生return事件。回调中仅接收到ack

我不确定是Rabbitmq还是amqplib行为。

node.js rabbitmq
1个回答
0
投票

我相信这里的预期行为令人困惑。

必需表示消息必须可路由到队列。如果至少有一个队列绑定到路由密钥,则满足强制条件。如果没有,则返回该消息。

有两种接收退货的方法。首先,您可以使用immediate标志。这告诉代理该消息必须立即可传递给使用者(而不仅仅是队列)。或者,您可以按照需要使用强制性标志。

在两种情况下,如果邮件是可传递的,您都不应期望将其返回。因此,如果您的一个队列已关闭,而另一个队列已启动,则您已满足任一标志的条件,并且将没有返回的消息。

发布者确认不同。此功能将告诉客户端代理何时接受了消息。如果代理成功地accepts]消息,则无论消息到达何处,都会收到确认。

根据下面的评论,以下文档是相关的。

对于可路由消息,当所有队列都接受了消息时,将发送basic.ack。对于路由到持久队列的持久消息,这意味着持久存储到磁盘。对于镜像队列,这意味着所有镜像都已接受该消息。

© www.soinside.com 2019 - 2024. All rights reserved.