RabbitMQ如何保证消息可靠性

64 阅读2分钟

要知道RabbitMQ为什么需要消息的可靠性,我们需要知道为什么会丢失,介绍一下消息丢失的情况

1、生产者发送的消息没有到达交换机
2、消息到达交换机,没有正确路由到正确的队列
3、MQ宕机,发送到队列中的消息不见了
4、消费者收到消息,还没消费,消费者在消费消息时发生宕机	

1、如何保证消息不丢失?

1、消息能不能丢?
看情况,不太重要的消息,丢了也没事,重要的消息,跟事务数据一致性相关的消息,是不能丢的。
2、如何解决
2.1、生产者确认机制(publisher-confirm)
即 如果消息成功投递到交换机,交换机返回ack给生产者;如果消息未成功投递到交换机,交换机返回nack给生产者
2.2、生产返回机制(publisher-return) 即 生产者发送的消息未正确到达队列,则返回ack及失败原因

image.png

2、如果面试过程问:如何保证RabbitMQ的消息可靠性,即可按下面说法回答

1、首先我们需要在生产者代码方开启(确认)confirm机制,保证消息正确到达交换机(正确到达后返回ack,否则返回nack)
2、生产者开启return机制,保证消息正确到达队列:返回机制(return mechanism)可以确保消息成功路由到队列。
当消息无法被路由到队列时,可以将消息返回给生产者,避免消息丢失或被丢弃。
3、交换机、队列、消息进行持久化:持久化可以确保在消息队列崩溃或重启后,交换机、队列和消息能够恢复并保持持久化状态,避免数据丢失。
4、消费者可以选择手动确认消息处理完成(手动ack),或者配置自动确认的同时定义一些失败处理策略。例如,将处理失败的消息路由到专门的错误交换机和队列中,以便后续进行人工干预和重新处理。