RocketMQ如何处理消息丢失的问题,同步刷盘,异步刷盘,异步复制,同步双写

时间:2024-04-04 20:06:04

RocketMQ 消息持久化

RocketMQ如何处理消息丢失的问题,同步刷盘,异步刷盘,异步复制,同步双写

  1. 生产者向RocketMQ broker发送消息
  2. mq收到消息以后,会将消息持久化到硬盘,这样才能保证机器宕机重启后消息不丢失,仍然可以给消费者进行消费。这里有两种刷盘策略:同步刷盘、异步刷盘
  • 同步刷盘:也就是mq收到消息后,必须将消息持久化到硬盘以后才向Producer端返回ACK成功状态,这样就可以100%保证消息不丢失。除非硬盘也坏了。。。
  • 异步刷盘:mq收到消息后,将消息存入操作系统的OS cache里面,通过异步定时将消息刷入磁盘,这样可能会有少部分数据丢失,因为有可能消息还在os cache里面,但是机器突然宕机了,数据就没了,会有少量数据丢失。
  • 性能上,异步刷盘肯定要比同步刷盘要快一点的。看业务需求进行

Broker配置文件里的flushDiskType参数设置的,这个参数被设置成SYNC_FLUSH、ASYNC_FLUSH

RocketMQ 异步复制,同步双写

RocketMQ如何处理消息丢失的问题,同步刷盘,异步刷盘,异步复制,同步双写
RocketMQ broker可以几种部署方式

单机部署

只有一台master broker ,只能在测试或者本地玩玩,生产会有单点故障风险。

多master broker

有多台broker, 全部都设置为master。因为一个topic可以分散在多台broker上,一台broker也可以放多个topic,是多对多的关系,可以承载更高的并发。但是其中一台broker宕机后,改机器上的数据可能会丢失,或者延迟消费。

多master broker,多slave broker,异步复制,同步双写

rocket mq中一个master 可以有多个slave,一个slave,只能有一个master。如上图,master 1后面可以跟着部署一个slave1,这样可以保证处于高可用状态,当master 故障不能提供服务的时候,salve可以替换估计机器成为master,继续对外提供服务。master的数据会同步至salve。

master收到消息后,会进行数据同步到slave,有两种策略:

  • 异步复制:也就是当master收到消息后,先向producer 返回ack成功状态,然后再异步将数据同步至salve。
  • 同步双写:master收到消息后,需要同时将该消息同步至salve后才将ack成功状态返回给producer。

并发性能上肯定是异步复制要不同步双写要好的,但是异步复制是有可能会造成数据不一致的,因为当master返回ack成功状态后,可能还没来得及同步至salve,然后机器故障宕机了,此时就会导致该消息消费者消费不到,消息就会被延迟。

同步复制和异步复制是通过Broker配置文件里的brokerRole参数进行设置的,这个参数可以被设置成
ASYNC_MASTER、SYNC_MASTER、SLAVE三个值中的一个。

总结

所以,rocket mq是有可能会丢数据的,而且也是有可能因为master宕机导致消息消费延迟的,但是这都是可以通过参数调节,保证100%数据不丢失的。