rabbitMQ 中的 Ack 或 Nack

Ack or Nack in rabbitMQ

我正在使用 rabbitMQ,我使用 basic_get 从队列中取出每条消息,而没有自动确认程序,这意味着消息将保留在队列中,直到我确认或取消消息。

有时我会收到一些无法处理的消息,因为抛出了一些异常,导致它们无法被完全处理。

问题是,如果我既成功确认消息又抛出异常,这有什么关系,我的意思是就结果消息而言,总是会离开队列,所以如果我在中使用 ack 或 nack 有什么关系这种情况? 也许我在使用每个操作时都错过了一些东西?

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

basic.nack command is apparently a RabbitMQ extension, which extends the functionality of basic.reject 包括批量处理模式。两者都包含 requeue 的 "bit"(即布尔值)标志,因此您实际上有多种选择:

  • nack/rejectrequeue=1:消息将像新消息一样返回到它来自的队列;这在消费者端暂时失败的情况下可能很有用
  • nack/rejectrequeue=0 和配置的死信交换 (DLX),会将消息发布到该交换,允许它被另一个队列接收
  • nack/reject with requeue=0 没有 DLX 会简单地丢弃消息
  • ack 将从队列中删除消息,即使配置了 DLX

如果您没有配置 DLX,始终使用 ack 将与 nack/rejectrequeue=0 相同;但是,从一开始就使用逻辑上正确的函数将使您以后可以更灵活地进行不同的配置。