如果将消息发布(启用确认)到具有免费消费者的队列,RabbitMQ 是否会提供交付保证?
Does RabbitMQ make delivery guarantees if a message is published (confirms-enabled) to a queue with a free consumer?
上下文:
假设我使用 RabbitMQ 执行以下操作:
- 将消费者连接到 RabbitMQ 中的队列
Q
。
- 此消费者可以处于
noack
模式,也可以不处于;没有区别。
- 如果不是
noack
模式;假设此消费者已设置 basic.qos
和 channel.flow
以便它可以接收消息;它的缓冲区未满并且可以使用。
- 将发布者连接到同一个 RabbitMQ 集群,并将 mandatory 消息(启用 publish confirmations)发布到
Q
。
- 在发布者中收到
basic.ack
。
问题:
- 当返回
basic.ack
时,RabbitMQ 是否保证已将该消息发送到消费者的远程套接字?我知道它不能保证消息已 到达 在消费者的本地套接字缓冲区中,但我对代理是否发送它感兴趣。
mandatory
发布的 presence/absence 是否以任何方式影响这些保证?
- 在消息发布之前队列是否完全为空是否会以任何方式影响这些保证?
- RabbitMQ 路由消息的版本是否以任何方式影响这些保证(即这些保证是否仅存在于某些 RMQ 版本中)?
- 消息的持久性是否以任何方式影响这些保证?
- 目标 RMQ 是否 clustered 会以任何方式影响这些保证吗?
- 每条消息的 presence/absence 过期时间是否以任何方式影响这些保证?
TL;DR:在任何情况下 RMQ 向发布者保证已发布的消息已从代理发送到消费者?
我尝试过的:
我已经尝试通过连接消费者并将消息发布到各种配置的队列来对此进行测试。通常在收到 basic.ack
时已收到消息。但是,我无法从中推断出任何保证,因为在许多地方引入了延迟和混乱:
basic.ack
返回发布者的运输时间。
- 消息正文到消费者的传输时间。
- 同步发布者和消费者之间的跟踪时钟(如果它们在不同的 hosts/in 不同的进程中)使得这很难证明。
因此,由于在外部验证这些内容(缺少模糊器或 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
,因为消息已发布。它只是没有去任何地方。
上下文:
假设我使用 RabbitMQ 执行以下操作:
- 将消费者连接到 RabbitMQ 中的队列
Q
。- 此消费者可以处于
noack
模式,也可以不处于;没有区别。 - 如果不是
noack
模式;假设此消费者已设置basic.qos
和channel.flow
以便它可以接收消息;它的缓冲区未满并且可以使用。
- 此消费者可以处于
- 将发布者连接到同一个 RabbitMQ 集群,并将 mandatory 消息(启用 publish confirmations)发布到
Q
。 - 在发布者中收到
basic.ack
。
问题:
- 当返回
basic.ack
时,RabbitMQ 是否保证已将该消息发送到消费者的远程套接字?我知道它不能保证消息已 到达 在消费者的本地套接字缓冲区中,但我对代理是否发送它感兴趣。 mandatory
发布的 presence/absence 是否以任何方式影响这些保证?- 在消息发布之前队列是否完全为空是否会以任何方式影响这些保证?
- RabbitMQ 路由消息的版本是否以任何方式影响这些保证(即这些保证是否仅存在于某些 RMQ 版本中)?
- 消息的持久性是否以任何方式影响这些保证?
- 目标 RMQ 是否 clustered 会以任何方式影响这些保证吗?
- 每条消息的 presence/absence 过期时间是否以任何方式影响这些保证?
TL;DR:在任何情况下 RMQ 向发布者保证已发布的消息已从代理发送到消费者?
我尝试过的:
我已经尝试通过连接消费者并将消息发布到各种配置的队列来对此进行测试。通常在收到 basic.ack
时已收到消息。但是,我无法从中推断出任何保证,因为在许多地方引入了延迟和混乱:
basic.ack
返回发布者的运输时间。- 消息正文到消费者的传输时间。
- 同步发布者和消费者之间的跟踪时钟(如果它们在不同的 hosts/in 不同的进程中)使得这很难证明。
因此,由于在外部验证这些内容(缺少模糊器或 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
,因为消息已发布。它只是没有去任何地方。