我正在使用rabbitMQ,我使用basic_get从队列中获取每条消息,而不会自动执行acking过程,这意味着消息会保留在队列中,直到我确认消息为止。
有时我会因为抛出一些异常而无法处理的消息阻止它们被完全处理。
问题是,如果我成功地消息并且抛出异常,那么重要的是,我的意思是在结果消息方面总是会退出队列,所以如果我在这种情况下使用ack或nack,那有什么关系呢? ? 也许我在使用每个操作时都会错过一些东西?
答案 0 :(得分:36)
basic.nack命令显然是RabbitMQ扩展,它扩展了basic.reject的功能以包括批量处理模式。两者都包括" bit" (即布尔)requeue
的标志,所以你实际上有几个选择:
nack
/ reject
与requeue=1
:消息将返回到它来自的队列,就像它是一条新消息一样;如果消费者方面出现暂时性故障,这可能很有用nack
/ reject
requeue=0
和已配置的死信交换(DLX),会将消息发布到该交换机,允许其被另一个队列接收nack
/ reject
与requeue=0
并且没有DLX只会丢弃该消息ack
也会从队列中删除该消息如果您没有配置DLX,则始终使用ack
将与nack
/ reject
requeue=0
相同;但是,从一开始就使用逻辑上正确的功能将为您提供更大的灵活性,以便以后以不同的方式进行配置。
答案 1 :(得分:2)
Ack和Nack都从队列中删除了消息,不同之处在于当你输入一条消息时,如果有一个为该队列定义了消息,它将进入DLX(死信队列)。