在RabbitMQ中的Ack或Nack

Jav*_*aSa 18 amqp rabbitmq

我正在使用rabbitMQ,我使用basic_get从队列中获取每条消息而不自动执行acking过程,这意味着消息保留在队列中,直到我确认或无法消息.

有时我会抛出因为抛出一些异常而无法处理的消息,这会阻止它们被完全处理.

问题是,如果我同时收到成功的消息和抛出的异常,那么重要的是,我的意思是结果消息总是会从队列中消失,所以如果我在这种情况下使用ack或nack,那有什么关系呢?也许我在使用每个操作时都会错过一些东西?

IMS*_*SoP 40

basic.nack命令显然是一个RabbitMQ的扩展,它延伸的功能basic.reject到包括体处理模式.两者都包含一个"位"(即布尔)标志requeue,所以你实际上有几个选择:

  • nack/ rejectwith requeue=1:消息将返回到它来自的队列,就好像它是一条新消息; 如果消费者方面出现暂时性故障,这可能很有用
  • nack/ rejectwith requeue=0和配置的死信交换(DLX),将消息发布到该交换机,允许它被另一个队列接收
  • nack/ rejectrequeue=0和没有DLX将简单地丢弃该消息
  • ack 即使配置了DLX,也会从队列中删除该消息

如果您没有配置DLX,则始终使用ack将与nack/ rejectwith 相同requeue=0; 但是,从一开始就使用逻辑上正确的功能将为您提供更大的灵活性,以便以后以不同方式配置.


jhi*_*den 6

Ack 和 Nack 都会从队列中删除消息,不同之处在于,当您 Nack 一条消息时,如果为该队列定义了一个消息,它就会进入 DLX(死信队列)。

  • 如果您使用 Nack 并将 requeue 选项设置为 true,则不会。将其设置为 true 将从消费者的获取中删除消息并将其添加回原始队列以进行重新处理。 (2认同)