#####queue <–> consumer queue 和 consumer 之间的消息确认机制:通过设置 ACK(acknowledgement)。

consumer 返回 ACK,为了告诉 Broker 这条消息已经被成功处理了,只要没收到 consumer 的 ACK 或者 NACK,broker 就会一直保持这条消息。

#####publisher 确认消息被消费

  1. 事务机制 标准的 AMQP ,唯一能够保证消息不会丢失的方式是利用事务机制。令 channel 处于 transactional 模式,向其 publish 消息,执行 commit 动作。但是这么做,事务机制会带来大量的多余开销,导致吞吐量下降。

  2. Publisher Confirm client 首先要发送 confirm.select 方法帧。取决于是否设置了 no-wait 属性,broker 会相应的判断是否以 confirm.select-ok进行应答。一旦在 channel 上使用 confirm.select 方法,channel 就将处于 confirm 模式。

一旦 channel 处于 confirm 模式,broker 和 client 都将启动消息计数(以 confirm.select 为基础从1开始计数)。broker 会处理完消息后,在当前 channel 上通过发送 basic.ack 的方式对其进行 confirm。delivery-tag 域的值标识了被 confirm 消息的序列号。broker 也可以通过设置 basic.ack 中的 multiple 域来表明到执行序列号为止的所有消息都已被 broker 正确的处理了。

在异常情况中,broker 讲无法处理相应的消息,此时 broker 将发送 basic.nack 代替 basic.ack 。

文档:

1,Introducing Publisher Confirms 2,ConfirmDontLoseMessages.java 3,AMQP Support 4,Spring AMQP 5,RabbitMQ消息队列(九):Publisher的消息确认机制