詹学伟
詹学伟
Published on 2024-06-22 / 24 Visits
0
0

RocketMQ如何保证消息不丢失?

一、消息从产生到消费过程

一个消息从生产者产生,到被消费者消费,主要经过这 3 个过程:

  1. 生产者产生消息

  2. 消息发送到存储端,保存下来

  3. 消息推送到消费者,消费者消费完,ack应答

因此如何保证MQ不丢失消息,可以从这三个阶段阐述:

  • 生产者保证不丢消息

  • 存储端不丢消息

  • 消费者不丢消息

二、生产者保证不丢消息

生产端如何保证不丢消息呢?确保生产的消息能顺利到达存储端。

如果是RocketMQ消息中间件的话,Producer生产者提供了三种发送消息的方式,

分别是:

  • 同步发送

  • 异步发送

  • 单向发送

生产者要想发消息时保证消息不丢失,可以:

  • 采用同步方式发送,send消息方法返回成功状态,即消息正常到达了存储端Broker

  • 如果send消息异常或者返回非成功状态,可以发起重试。

  • 可以使用事务消息,RocketMQ的事务消息机制就是为了保证零丢失来设计的

三、存储端不丢消息

如何保证存储端的消息不丢失呢?确保消息持久化到磁盘,那就是刷盘机制嘛。

刷盘机制分同步刷盘和异步刷盘:

  • 同步刷盘:生产者消息发过来时,只有持久化到磁盘,RocketMQ的存储端Broker才返回一个成功的ACK响应。它保证消息不丢失,但是影响了性能。

  • 异步刷盘:只要消息写入PageCache缓存,就返回一个成功的ACK响应。这样提高了MQ的性能,但是如果这时候机器断电了,就会丢失消息。除了同步刷盘机制,还有一个维度需要考虑。Broker一般是集群部署的,有主节点和从节点。消息到Broker存储端,只有主节点和从节点都写入成功,才反馈成功的ack给生产者。这就是同步复制,它保证了消息不丢失,但是降低了系统的吞吐量。与之对应的是异步复制,只要消息写入主节点成功,就返回成功的ack,它速度快,但是会有性能问题

四、消费阶段不丢

消费者执行完业务逻辑,再反馈会Broker说消费成功,这样才可以保证消费阶段不丢消息。


Comment