果子私房笔记-RabbitMQ如何保证消息可靠

RabbitMQ如何保证消息可靠

消息传输的三个过程

生产端到MQ,MQ到消息端,消费端消费掉消息,任意过程都可能导致消息传输处理失败。
生产端到MQ

事务消息机制:会导致性能降低

confirm消息确认机制:生产端投递消息到MQ后,MQ会发送一个确认消息给生产端。

问题:MQ接收到消息并处理,但还未刚发送确认消息,或生产端由于网络问题未收到确认消息,生产端无法知道消息是否发送成功。

消息持久化:消息持久化能解决MQ突然挂掉导致内存中的消息丢失,其能让重启后的MQ通过硬盘中的数据恢复,exchange/queue/message均能进行持久化。
问题:MQ接收到消息还未来得及持久化到硬盘时挂掉。
解决:在发送消息之前先将消息保存到数据,增加status字段,超时时间/重发次数。
新问题:MQ成功接受消息,但是确定消息机制执行失败,可能导致消息的重复发送,较为有效的方式是每条消息确定一个字段为唯一ID。

消费端
也可以通过ack机制保证消息的可靠性。MQ默认在发出消息后会删除这条消息,而不管消费者是否收到或处理完成,导致消费端消息丢失时MQ也没有这条消息。增加手动ack机制即可解决。