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

时间:2016-09-17 17:40:55

标签: sockets networking concurrency rabbitmq latency

上下文

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

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

    • 当返回basic.ack时,RabbitMQ是否保证将该消息发送到消费者的远程套接字?我知道它不能保证消息在消费者的本地套接字缓冲区中到达,但我对代理是否发送它感兴趣。
    • mandatory出版物的存在与否是否会以任何方式影响这些保证?
    • 在发布消息之前队列是否完全为空会影响这些保证吗?
    • RabbitMQ路由消息的版本是否以任何方式影响这些保证(即这些保证仅出现在某些RMQ版本中)?
    • 消息的持久性是否会以任何方式影响这些保证?
    • 目的地RMQ是否clustered是否以任何方式影响这些保证?
    • 每条消息到期时间的存在与否是否会以任何方式影响这些保证?

    TL; DR:在任何情况下,RMQ都会向发布商保证已发布的消息已从代理发送给消费者

    我尝试过的事情:

    我尝试通过连接使用者并将消息发布到各种配置的队列来测试它。通常在收到basic.ack时收到消息。但是,由于在许多地方引入了延迟和混淆,我无法从中推断出任何保证:

    • basic.ack返回发布商的传输时间。
    • 邮件正文传递给消费者的时间。
    • 同步发布者和消费者之间的跟踪时钟(如果他们在不同的主机上/在不同的进程中),这很难证明。

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

1 个答案:

答案 0 :(得分:2)

  

在任何情况下,RMQ都会向发布商保证已发布的消息已从经纪人发送给消费者吗?

没有

发布者的ack是一个声明,表明RabbitMQ交换已收到该消息,并将被路由。

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