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

30 篇文章 3 订阅

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

首先

为什么要引入消息队列

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

会遇到哪些问题呢

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

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

        
                                                                华丽的分割线

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

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

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

解决方案

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

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

简单的方案可以采取本地消息表对消息进行补偿

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值