当前位置: 首页 > 后端技术 > Java

如何保证消息队列的可靠传输?

时间:2023-04-01 14:24:16 Java

消息丢失分为三种情况,可能有生产者、RabbitMQ、消费者。如果生产者丢失数据,首先要保证写入RabbitMQ的消息没有丢失。消息队列通过请求确认机制保证消息的可靠传输。生产开启comfirm模式。producer开启comfirm模式后,每发送一条消息都会分配一个唯一的id。如果写入RabbitMQ,RabbitMQ会返回一个ack信息。如果写入RabbitMQ失败,会回调一个nack接口,消息可以重发。一般producer端避免数据丢失,RabbitMQ使用confirm机制来丢失数据。如果RabbitMQ丢失数据,则需要启用RabbitMQ持久化。开启持久化后,生产者发送的消息会持久化到磁盘。即使RabbitMQ宕机,恢复后也会读取之前存储的数据。还有一种很少见的情况,就是RabbitMQ在持久化消息之前挂掉了。在这种情况下,需要结合生产者端的确认机制。只有将消息持久化到磁盘后,才会返回ack消息。如果producer没有收到ack,也可以自己重发。消费者丢失数据并消费丢失的数据。刚消费完RabbitMQ发送过来的数据,消费进程就挂了。重启进程后,RabbitMQ不会重新发送消息。这时候需要关闭RabbitMQ,关闭自动ack机制。消费者端每次处理后,在程序中做ack确认。这样如果没有处理完,就没有ack确认,那么RabbitMQ就会认为你还没有处理完,此时RabbitMQ会重新发送消息给消费者。总结Producer开启确认Comfirm机制MQ开启RabbitMQPersistentconsumer关闭RabbitMQ自动ack确认觉得文章对您有帮助,请点个赞!