> 文档中心 > 「RocketMQ」如何保证消息不丢失

「RocketMQ」如何保证消息不丢失


        当我们实际项目开发中,引入一个中间件都要考虑为什么要引进他,引进它会遇到哪些问题。

首先

为什么要引入消息队列

  • 解耦:分布式系统中涉及到的数据交互
  • 削峰:高并发场景下,为了更快的作出相应,会考虑引入消息队列
  • 异步:减少响应时间

会遇到哪些问题呢

  • 系统的可用性降低:如果消息队列挂掉了,服务之间通讯就会受限
  • 复杂性提高
  • 数据丢失

本文主要对「数据丢失」做一些分享

        
                                                                华丽的分割线

———————————————————————————————————————————————

1. 会产生数据丢失的场景 如下图
        

        如上图所属,这是一个完整的消息从生产到消费的大体流程,黄色标签的步骤都可能会引起消息丢失。

解决方案

  •  第一步:生产者生产消息,由于网络等原因并没有发送到borker中,但是本地事物已经提交了。造成数据的不一致性,消息丢失。(采用消息的事务性
  • 第二三步:默认的borker持久化磁盘机制采用的是异步(可以修改borker文件 默认flushDiskType=ASYNC_FLUSH。SYNC_FLUSH同步刷盘
  • 第三步:手动确认。(如rabbitmq开启手动ack rocketmq默认开启如果返回失败或消费中异常,会多次重发消息可以设置消费次数

 以上都是针对中间件本身进行的处理

简单的方案可以采取本地消息表或者最大努力通知对消息进行补偿