RabbitMQ在“确认”模式下的通道行为

我在理解RabbitMQ的确认方面遇到了一些麻烦,我从RabbitMQ看到以下解释:

笔记

如果代理在所述消息写入磁盘之前崩溃,代理将丢失持久性消息。 在某些情况下,这会导致经纪人以令人惊讶的方式行事。 例如,考虑这种情况:

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

  • 客户端使用队列中的消息(注意消息是持久的并且队列持久),但还没有确认,

  • 经纪人死亡并重新启动,并且

  • 客户端重新连接并开始消费消息。

  • 此时,客户可以合理地认为该消息将再次发送。 情况并非如此:重新启动导致代理丢失消息。 为了保证持久性,客户应该使用确认。 如果发布者的频道处于确认模式,则发布者不会收到丢失消息的确认(因为消费者没有确认并且没有写入磁盘)。

    然后我使用这个http://hg.rabbitmq.com/rabbitmq-java-client/file/default/test/src/com/rabbitmq/examples/ConfirmDontLoseMessages.java来做一些基本的测试并验证确认,但是得到一些奇怪的结果:

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


    我的理解是,“渠道确认”对于经纪人来说确认它成功地从生产者那里获得了消息,而不管消费者是否知道该消息。 有关详细信息,请参阅http://www.rabbitmq.com/confirms.html,具体取决于队列类型和消息传递模式,

    消息在以下情况下得到确认

  • 它决定一条消息不会被路由到队列(如果强制标志被设置,那么basic.return会被首先发送)或者
  • 一个短暂的消息已经到达了它的所有队列(和镜像)或者
  • 一个持久的消息已经到达了它的所有队列(和镜像)并且被持久化到了磁盘(和fsynced)或者
  • 持久性消息已经从其所有队列中消耗(并且如果必要的话)

  • 老问题,但哦..

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

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

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

    如果需要,确认和确认可以启动,制片人不会等待赞赏。 我现在找不到确切的命令,但它确实存在。

    更多关于acks和确认:https://www.rabbitmq.com/reliability.html

    链接地址: http://www.djcxy.com/p/10159.html

    上一篇: Behavior of channels in "confirm" mode with RabbitMQ

    下一篇: Why does Time::HiRes::stat break list subscripting?