如果将消息发布(启用确认)到具有免费消费者的队列,RabbitMQ 是否会提供交付保证?

Does RabbitMQ make delivery guarantees if a message is published (confirms-enabled) to a queue with a free consumer?

上下文:

假设我使用 RabbitMQ 执行以下操作:

  1. 将消费者连接到 RabbitMQ 中的队列 Q
    • 此消费者可以处于 noack 模式,也可以不处于;没有区别。
    • 如果不是noack模式;假设此消费者已设置 basic.qoschannel.flow 以便它可以接收消息;它的缓冲区未满并且可以使用。
  2. 将发布者连接到同一个 RabbitMQ 集群,并将 mandatory 消息(启用 publish confirmations)发布到 Q
  3. 在发布者中收到basic.ack

问题:

TL;DR:在任何情况下 RMQ 向发布者保证已发布的消息已从代理发送到消费者?

我尝试过的:

我已经尝试通过连接消费者并将消息发布到各种配置的队列来对此进行测试。通常在收到 basic.ack 时已收到消息。但是,我无法从中推断出任何保证,因为在许多地方引入了延迟和混乱:

因此,由于在外部验证这些内容(缺少模糊器或 jepsen 之类的东西),我正在寻求代理本身由于其内部代码流而提供的保证的知识。

Are there any circumstances in which RMQ guarantees, to the publisher that a published message has been sent from the broker to a consumer?

没有。

发布者的 ack 是 RabbitMQ 交换器已收到消息并将被路由的声明。

例如,您可以使用未连接到队列的路由键将消息路由到遗忘状态。在这种情况下,发布者仍会收到 ack,因为消息已发布。它只是没有去任何地方。