“中渠道的行为”;“确认”;带RabbitMQ的模式

“中渠道的行为”;“确认”;带RabbitMQ的模式,rabbitmq,Rabbitmq,我在理解RabbitMQ的确认时遇到了一些问题,我从RabbitMQ中看到了以下解释: 注释 如果代理在此之前崩溃,则会丢失持久消息 消息被写入磁盘。在某些情况下,这会导致 经纪人的行为举止令人惊讶。例如,考虑这个 情景: 客户端将持久消息发布到持久队列 客户机使用队列中的消息(注意消息是持久的,队列是持久的),但尚未确认它 代理死亡并重新启动,并且 客户端重新连接并开始使用消息 此时,客户机可以合理地假设消息 将再次交付。情况并非如此:重启导致 代理可能会丢失消息。为了保证持久性,一个 客

我在理解RabbitMQ的确认时遇到了一些问题,我从RabbitMQ中看到了以下解释:

注释

如果代理在此之前崩溃,则会丢失持久消息 消息被写入磁盘。在某些情况下,这会导致 经纪人的行为举止令人惊讶。例如,考虑这个 情景:

  • 客户端将持久消息发布到持久队列

  • 客户机使用队列中的消息(注意消息是持久的,队列是持久的),但尚未确认它

  • 代理死亡并重新启动,并且

  • 客户端重新连接并开始使用消息

此时,客户机可以合理地假设消息 将再次交付。情况并非如此:重启导致 代理可能会丢失消息。为了保证持久性,一个 客户应使用确认。如果出版商的频道在 确认模式下,发布服务器将不会收到 信息丢失(因为消费者没有确认,也没有收到) 写入磁盘)

然后我用它来做一些基本的测试和验证确认,但得到一些奇怪的结果:

  • waitForConfirmsOrDie方法不会阻止生产者,这与我的预期不同,我认为waitForConfirmsOrDie将阻止生产者,直到所有消息都已确认或其中一条消息已被nack
  • 我从发布服务器中删除channel.confirmSelect()和channel.waitForConfirmsOrDie(),并将使用者从自动确认更改为手动确认,我将所有消息发布到队列并逐个消费消息,然后在消费过程中停止rabbitmq服务器,我现在期望的是,rabbitmq服务器重新启动后,留下的消息将丢失,因为通道未处于确认模式,但在服务器重新启动后,我仍然可以看到队列中的所有其他消息
  • 由于我是RabbitMQ的新手,有人能告诉我确认理解的问题在哪里吗?

    我的理解是,“通道确认”用于代理确认它成功地从生产者获得消息,而不管消费者是否确认此消息。根据队列类型和消息传递模式,请参阅以了解详细信息

    在以下情况下确认消息:

    • 它决定消息不会路由到队列 (如果设置了强制标志,则首先发送basic.return)或
    • 临时消息已到达其所有队列(和镜像)或
    • 持久消息已到达其所有队列(和镜像),并被持久化到磁盘(和fsynced)或
    • 已从其所有队列中使用(并在必要时确认)持久消息

      • 老问题,但哦,好吧

        我将所有消息发布到队列并逐个消费消息,然后在消费过程中停止rabbitmq服务器,现在我希望rabbitmq服务器重新启动后,留下的消息将丢失,因为通道未处于确认模式,但在服务器重新启动后,我仍然可以看到队列中的所有其他消息

        如果启用了持久性,它实际上应该是这样工作的。如果服务器崩溃或出现其他问题,则无法确认消息,因此不会从队列中删除消息

        只有在确认消息已被处理,或者在服务器崩溃之前代理尚未将其写入内存或磁盘时,才会从队列中删除消息

        如果需要,可以设置确认和确认,并且制作人不会等待确认。我现在找不到它的确切命令,但它确实存在

        有关ACK和确认的更多信息: