【问题标题】:Ack or Nack in rabbitMQrabbitMQ 中的 Ack 或 Nack
【发布时间】:2015-05-01 21:07:15
【问题描述】:

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

有时我的消息由于引发了一些异常而无法处理,这阻止了它们被完全处理。

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

【问题讨论】:

  • 唯一的区别是nack允许requeue,而ack不允许?

标签: rabbitmq amqp


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    basic.nack 命令显然是一个 RabbitMQ 扩展,它扩展了basic.reject 的功能以包含批量处理模式。两者都包含requeue 的“位”(即布尔值)标志,因此您实际上有多种选择:

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

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

    【讨论】:

    • 壮观的答案!但是,如果 DLX 已经被视为队列,您能否澄清一下。队列和交换之间有什么区别?
    • @JavaSa 一个常见的类比(对您来说可能有意义也可能没有意义)是交易所就像邮局,而队列就像邮政信箱。您只向交换器发布新消息(即使它是默认交换器);然后,交换会将其路由到零个、一个或多个队列,通常基于其“路由密钥”。因此,最简单的 DLX 是将所有内容路由到一个队列中,但它可以根据您的需要复杂。
    猜你喜欢
    • 2018-12-17
    • 2015-04-20
    • 1970-01-01
    • 2015-11-09
    • 2019-06-21
    • 2017-03-16
    • 2017-09-01
    • 2017-10-03
    • 2020-05-27
    相关资源
    最近更新 更多