RabbitMQ NACK 消息

sme*_*its 4 amqp rabbitmq node.js

我的经验:在发布/订阅场景中,如果订阅者收到一条消息,这条收到的消息会立即重新排在队列的前面,这将是订阅者收到的下一条消息。

有没有办法避免这种情况?是否有可能以下一条消息肯定不是刚刚收到的消息的方式来处理消息?

我正在使用 Node.js 和amqp.node与 RabbitMQ 通信

the*_*yer 8

Nack是 AMQP 协议的 RabbitMQ 特定增强。它允许消息的使用者在消息成功处理时通知服务器。我想你已经到了这一步。

这里有趣的是,AMQP 最初并不认为Nack是必要的。为什么?因为消费者无法处理消息时的 AMQP 行为是消费者在不ack-ing 消息的情况下关闭连接。在这种情况下,消息会自动按照原来的顺序重新排队,并通过redelivered设置标志传递给下一个可用的使用者。

为什么会这样?

因为 aNack表示消费者的问题,而不是消息。如果消息本身是坏消息,AMQP 假设消费者足够聪明,可以识别出这个ack消息,然后采取程序员设计的任何其他步骤来处理坏消息。

RabbitMQ 添加了Nackrequeue参数的函数。默认情况下,requeue为 true - 意味着在 nack 时,代理将重新排队消息。这符合 AMQP 设计的初衷。但是,如果您传递requeue为 false,则代理将死信消息。这是通常由使用 AMQP 的智能应用程序架构师设计的行为的捷径,因此您可以将其视为对程序员的便利。

两者之间的区别

在第一种情况下,Nack指示消息使用者存在问题。消费者在解决问题时应该让自己离线。在第二种情况下,Nack表示消息有问题。第一种情况是暂时性问题,而第二种情况是永久性故障。

如果我不能处理特定的消息是什么,现在可能过几天吧?

如果您的消息传递结构设计得当,这将永远不会发生。如果一个特定的消息需要与另一条消息不同的处理路径或资源,则该消息类型应该有自己的队列。当处理这些消息的依赖项离线或不可用时,该队列的使用者可以停止消费。