消息可靠性投递


默认情况下,消息发送端发送消息给 RabbitMQ 后,RabbitMQ 是不会返回任何信息的。 那么我们怎么知道消息是中途丢失了还是到达了 broker 呢?

RabbitMQ 提供了两种确认消息是否投递成功的方法:

Channel Transaction 模式

RabbitMQ 中与 AMQP 事务机制有关的方法有三个

在通过 txSelect 开启事务之后,我们便可以发布消息给 broker 代理服务器了,如果 txCommit 提交成功了,则消息一定到达了 broker 了,如果在 txCommit 执行之前 broker 异常崩溃或者由于其他原因抛出异常,这个时候我们便可以捕获异常通过 txRollback 回滚事务了。

事务确实能够解决 producer 与 broker 之间消息确认的问题,只有消息成功被 broker 接收,事务提交才能成功,否则我们便可以在捕获异常进行事务回滚操作,同时进行消息重发,但是使用事务机制的话会降低 RabbitMQ 的性能。

RabbitMQ 提供了一个更好的方案,使用 channel 信道的 confirm 模式。

Channel Confirm 模式

生产者通过调用 channel 的 confirmSelect 方法将 channel 设置为 confirm 模式。

该模式下,所有在该信道上发布的消息都会被分派一个唯一的ID(从1开始),当消息被投递到所有匹配的队列后,broker 就会发送一个(包含消息的唯一 ID 的)确认给发送端, 如果 RabbitMQ 因为自身内部错误导致消息丢失,就会发送一条 nack 消息,发送端的 Confirm Listener 会去监听应答。