目录

Producer发送消息阶段

手段一:提供SYNC的发送消息方式,等待broker处理结果。

手段二:发送消息如果失败或者超时,则重新发送。

手段三:broker提供多master模式

总结

Broker处理消息阶段

手段四:提供同步刷盘的策略【等待刷盘成功才会返回producer成功】

手段五:提供主从模式,同时主从支持同步双写

总结

Consumer消费消息阶段

手段六:consumer默认提供的是At least Once机制

手段七:消费消息重试机制

总结


Producer发送消息阶段

发送消息阶段涉及到Producer到broker的网络通信,因此丢失消息的几率一定会有,那RocketMQ在此阶段用了哪些手段保证消息不丢失了(或者说降低丢失的可能性)。

手段一:提供SYNC的发送消息方式,等待broker处理结果。

RocketMQ提供了3种发送消息方式,分别是:

同步发送:Producer 向 broker 发送消息,阻塞当前线程等待 broker 响应 发送结果

异步发送:Producer 首先构建一个向 broker 发送消息的任务,把该任务提交给线程池,等执行完该任务时,回调用户自定义的回调函数,执行处理结果。

Oneway发送:Oneway 方式只负责发送请求,不等待应答,Producer只负责把请求发出去,而不处理响应结果。

我们在调用producer.send方法时,不指定回调方法,则默认采用同步发送消息的方式,这也是丢失几率最小的一种发送方式(但是效率比较低)。

手段二:发送消息如果失败或者超时,则重新发送。

发送重试源码如下,本质其实就是一个for循环当发送消息发生异常或超时的时候重新循环发送默认重试3次,重试次数可以通过producer指定。

手段三:broker提供多master模式

即使某台broker宕机了,保证消息可以投递到另外一台正常的broker上。

如果broker只有一个节点,则broker宕机了,即使producer有重试机制,也没用(Broker都挂了,哪来的重试机制),因此利用多主模式,当某台broker宕机了,换一台broker进行投递,保持高可用。

总结

producer消息发送方式虽然有3种,但为了减小丢失消息的可能性尽量采用同步的发送方式,同步等待发送结果,利用同步发送+重试机制+多个master节点,尽可能减小消息丢失的可能性。

Broker处理消息阶段

手段四:提供同步刷盘的策略【等待刷盘成功才会返回producer成功】

public enum FlushDiskType { SYNC_FLUSH, //同步刷盘 ASYNC_FLUSH//异步刷盘(默认) }

我们知道,当消息投递到broker之后,会先存到page cache【页面缓存】,然后根据broker设置的刷盘策略是否立即刷盘,也就是如果刷盘策略为异步,broker并不会等待消息落盘才返回producer一个成功的消息,也就是说当broker所在的服务器突然宕机,则会丢失部分页的消息。同步刷盘的策略【等待刷盘成功才会返回给producer一个成功的消息】

解释:

同步刷盘:当数据写入到内存中之后立刻刷盘(同步的将内存中的数据持久化到磁盘上),在保证刷盘成功的前提下响应一个消息给Producer。

异步刷盘:数据写入内存后,直接响应一个消息给Producer。异步将内存中的数据持久化到磁盘上。

手段五:提供主从模式,同时主从支持同步双写

即使broker设置了同步刷盘,如果主broker磁盘损坏,也是会导致消息丢失。 因此可以给broker指定slave,同时设置master为SYNC_MASTER,然后将slave设置为同步刷盘策略

此模式下,producer每发送一条消息,都会等消息投递到master和slave都落盘成功了,broker才会当作消息投递成功,从而保证休息不丢失。

总结

在broker端,消息丢失的可能性主要在于刷盘策略和同步机制。

RocketMQ默认broker的刷盘策略为异步刷盘,如果有主从,同步策略也默认的是异步同步,这样子可以提高broker处理消息的效率,但是会有丢失的可能性。因此可以通过同步刷盘策略+同步slave策略(slave也可以进行刷盘)+主从双写的方式解决丢失消息的可能。

Consumer消费消息阶段

手段六:consumer默认提供的是At least Once机制

从producer投递消息到broker,即使前面这些过程保证了消息正常持久化,但如果consumer消费消息没有消费到也算是消息的丢失。因此RockerMQ默认提供了At least Once机制保证消息可靠消费。

何为At least Once?

Consumer先pull【主动拉取Broker中的信息】 消息到本地,消费完成后,才向服务器返回ack(消费成功的消息--acknowledge)

通常消费消息的ack机制一般分为两种思路

1、先提交后消费;

2、先消费,消费成功后再提交【这个更稳当】;

思路一可以解决重复消费的问题但是会丢失消息,因此Rocketmq默认实现的是思路二,由各自consumer业务方保证幂等(通过给每个消息携带一个唯一标识信息,去数据库进行判断。或者在producer的时候就存储一个唯一标识(消息),消费成功删除redis中的消息确保不被重复消费。)来解决重复消费问题。

手段七:消费消息重试机制

当消费消息失败了,如果不提供重试消息的能力,则也不能算完全的可靠消费,因此RocketMQ本身提供了重新消费消息的能力。

总结

consumer端要保证消费消息的可靠性,主要通过At least Once+消费重试机制保证。

归纳

MQ主要包含了4个组件 nameserver broker producer consumer

然后如何保证消息不丢失又需要对三个消息阶段进行保证

Producer发送消息阶段

1通过采用同步发送消息到broker等待broker接收到消息过后返回的一个确认消息,虽然效率低,但是时丢失几率最小的方式,异步1和单向消息发送丢失的几率比同步消息丢失的几率大。

2发送消息失败或超时则进行重试

3broker提供多master模式【即使某台broker宕机了,换一台broker进行投递,保持高可用】

===》采用同步消息和失败重试和多master模式

Broker处理消息阶段

手段四:提供同步刷盘的策略【等待刷盘成功才会返回producer成功】

当数据写入到内存中之后立刻刷盘(同步的将内存中的数据持久化到磁盘上),

手段五:提供主从模式,同时主从支持同步双写

主从broker都同步刷盘成功,才返回producer一个确认消息

===》采用同步刷盘+broker主从模式,支持同步双写

Consumer消费消息阶段

consumer默认提供的是At least Once机制

手段6 broker队列中的消息消费成功,才返回一个确认消息给broker。

手段7 当消息消费失败了,进行消费消息重试机制(保证幂等就行了。)

===》采用先消费,在返回一个确认消息+消息重试。

RocketMq怎么保证消息不丢失相关推荐

  1. RocketMQ如何保证消息不丢失? 如何快速处理积压消息?

    文章目录 1. 哪些环节会有丢消息的可能? 2. 消息生产阶段如何保证消息不丢失 2.1 同步发送 2.2 采用事务消息 3. Broker如何保证接收到的消息不会丢失 4. 消费者如何确保拉取到的消 ...

  2. RocketMQ如何保证消息不丢失(消息可靠性)

    为什么说ROcketMQ更适用于业务型的消息中间件,因为它能够保证消息不丢失且带有事务消息. 先来看一张RocketMQ集群部署结构 其中Name Server主要是提供路由信息,这里暂时忽略,大致流 ...

  3. rocketmq怎么保证数据不会重复_rocketmq如何保证消息不丢失

    一.大体可以从三方面来说: 分别从Producer发送机制.Broker的持久化机制,以及消费者的offSet机制来最大程度保证消息不易丢失 从Producer的视角来看:如果消息未能正确的存储在MQ ...

  4. 消息队列面试连环问:如何保证消息不丢失?处理重复消息?消息有序性?消息堆积处理?...

    大家好,我是 yes. 最近我一直扎在消息队列实现细节之中无法自拔,已经写了 3 篇Kafka源码分析,还剩很多没肝完.之前还存着RocketMQ源码分析还没整理.今儿暂时先跳出来盘一盘大方向上的消息 ...

  5. RocketMq重试及消息不丢失机制

    1.消息重试机制 由于MQ经常处于复杂的分布式系统中,考虑网络波动.服务宕机.程序异常因素,很有可能出现消息发送或者消费失败的问题.因此,消息的重试就是所有MQ中间件必须考虑到的一个关键点.如果没有消 ...

  6. 回答面试官:如何保证消息不丢失

    rocketmq是阿里开源的一个性能很强大的消息队列,很多公司都在用,而且经历了多次双十一的洗礼,支持多种特性 对于这个技术点不知道大家掌握的如何了,消息队列现在应该是公司必备的技能之一了,无论是Ra ...

  7. RocketMQ如何保证消息顺序消费?又为何不解决消息重复消费问题?

    消息的顺序消费对于业务系统来说非常重要,一笔订单产生了3条消息,分别是订单创建.订单付款.订单完成.消费时,必须按照顺序消费才有意义,与此同时多笔订单之间又是可以并行消费的. 如何保证消息顺序消费? ...

  8. MQ - 如何保证消息不丢失?处理重复消息?消息堆积处理?

    什么是消息队列 在百度百科中,消息队列是这么解释的:"消息队列"是在消息的传输过程中保存消息的容器. 消息队列全称为英文 Message Queue 简称(MQ)是一种应用程序对应 ...

  9. 你的消息队列如何保证消息不丢失,且只被消费一次,这篇就教会你

    我们将消息队列这个组件加入到了我们的商城系统里,并且通过秒杀这个实际的案例进行了实际演练,知道了它对高并发写流量做削峰填谷,对非关键业务逻辑做异步处理,对不同的业务系统做解耦合. 场景: 现在我们的电 ...

最新文章

  1. word通配符使用法详解
  2. mysql 主从优点_MySql主从配置实践及其优势浅谈
  3. TensorFlow Hub介绍:TensorFlow中可重用的机器学习模块库
  4. 上百台linux的服务器互信,批量自动建立linux服务器之间的ssh互信
  5. Linux工作笔记-解决安装Qt时缺少libX11-xcb.so.1文件问题
  6. SSH远程连接:简单的连接
  7. JavaScript、PHP、Golang、Haskell、Elixir,哪个才是最佳编程语言?
  8. node.js 数据库操作工具类封装
  9. Java Web前后端分离架构
  10. 数据结构之线性表的链式存储结构(C语言)
  11. 鸿蒙系统服务器在哪,鸿蒙的服务中心怎么打开?鸿蒙服务中心打开及关闭教程...
  12. java整除符号是什么意思_java除法及java除法运算的基础知识
  13. mysql otl变量绑定_OTL翻译(5) -- otl_stream流相关绑定变量
  14. mysql in数量限制_SQL语句中in的个数限制为1000
  15. 考研最后冲刺:这些要提前准备!
  16. mysql 1058_mysql启动服务报1058错误的解决方法
  17. Could not get a resource from the pool 问题解决
  18. android字符串加删除线,android textview 添加上划线 中划线 删除线
  19. java架构师全套图解,使用/教程/实例
  20. 达观数据中标大华智能搜索平台,助力企业打造知识共享系统

热门文章

  1. nvarchar在mysql中是_如何在MySQL中创建NVARCHAR列?
  2. 如何在一个APP内检测手机内安装了另外一个APP并且跳转到另外一个APP内?
  3. 【MATLAB基础绘图第10棒】绘制各种面积图
  4. 武汉大学和华中科技大学计算机,武汉大学和华中科技大学谁的实力更强?你根本猜不到...
  5. 工业计算机的那些接口,工业平板电脑几种常用接口介绍
  6. mybatis中@Results,@ResultMap注解使用
  7. Ubuntu9.04--qt4.5透明效果
  8. 关于error: #20: identifier “XXXX“ is undefined缺失.h文件的问题
  9. 【第1158期】哔哩哔哩的前端之路
  10. Business 2.0评出2007年25大网络新锐