在RabbitMQ中的Ack或Nack

时间:2015-03-01 13:34:11

标签: rabbitmq amqp

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

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

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

2 个答案:

答案 0 :(得分:36)

basic.nack命令显然是RabbitMQ扩展,它扩展了basic.reject的功能以包括批量处理模式。两者都包括" bit" (即布尔)requeue的标志,所以你实际上有几个选择:

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

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

答案 1 :(得分:2)

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