rocketmq怎么保证数据不会重复_rocketmq如何保证消息不丢失
一、大体可以从三方面来说:
分别从Producer发送机制、Broker的持久化机制,以及消费者的offSet机制来最大程度保证消息不易丢失
从Producer的视角来看:如果消息未能正确的存储在MQ中,或者消费者未能正确的消费到这条消息,都是消息丢失。
从Broker的视角来看:如果消息已经存在Broker里面了,如何保证不会丢失呢(宕机、磁盘崩溃)
从Consumer的视角来看:如果消息已经完成持久化了,但是Consumer取了,但是未消费成功且没有反馈,就是消息丢失
从Producer分析:如何确保消息正确的发送到了Broker?
默认情况下,可以通过同步的方式阻塞式的发送,check SendStatus,状态是OK,表示消息一定成功的投递到了Broker,状态超时或者失败,则会触发默认的2次重试。此方法的发送结果,可能Broker存储成功了,也可能没成功
采取事务消息的投递方式,并不能保证消息100%投递成功到了Broker,但是如果消息发送Ack失败的话,此消息会存储在CommitLog当中,但是对ConsumerQueue是不可见的。可以在日志中查看到这条异常的消息,严格意义上来讲,也并没有完全丢失
RocketMQ支持 日志的索引,如果一条消息发送之后超时,也可以通过查询日志的API,来check是否在Broker存储成功
从Broker分析:如果确保接收到的消息不会丢失?
消息支持持久化到Commitlog里面,即使宕机后重启,未消费的消息也是可以加载出来的
Broker自身支持同步刷盘、异步刷盘的策略,可以保证接收到的消息一定存储在本地的内存中
Broker集群支持 1主N从的策略,支持同步复制和异步复制的方式,同步复制可以保证即使Master 磁盘崩溃,消息仍然不会丢失
从Cunmser分析:如何确保拉取到的消息被成功消费?
消费者可以根据自身的策略批量Pull消息
Consumer自身维护一个持久化的offset(对应MessageQueue里面的min offset),标记已经成功消费或者已经成功发回到broker的消息下标
如果Consumer消费失败,那么它会把这个消息发回给Broker,发回成功后,再更新自己的offset
如果Consumer消费失败,发回给broker时,broker挂掉了,那么Consumer会定时重试这个操作
如果Consumer和broker一起挂了,消息也不会丢失,因为consumer 里面的offset是定时持久化的,重启之后,继续拉取offset之前的消息到本地
二、消息重复
上面在解决消息顺序问题时,引入了一个新的问题,就是消息重复。那么RocketMQ是怎样解决消息重复的问题呢?还是“恰好”不解决。
造成消息的重复的根本原因是:网络不可达。只要通过网络交换数据,就无法避免这个问题。所以解决这个问题的办法就是不解决,转而绕过这个问题。那么问题就变成了:如果消费端收到两条一样的消息,应该怎样处理?
1、消费端处理消息的业务逻辑保持幂等性
2、保证每条消息都有唯一编号且保证消息处理成功与去重表的日志同时出现
第1条很好理解,只要保持幂等性,不管来多少条重复消息,最后处理的结果都一样。第2条原理就是利用一张日志表来记录已经处理成功的消息的ID,如果新到的消息ID已经在日志表中,那么就不再处理这条消息。
我们可以看到第1条的解决方式,很明显应该在消费端实现,不属于消息系统要实现的功能。第2条可以消息系统实现,也可以业务端实现。正常情况下出现重复消息的概率不一定大,且由消息系统实现的话,肯定会对消息系统的吞吐量和高可用有影响,所以最好还是由业务端自己处理消息重复的问题,这也是RocketMQ不解决消息重复的问题的原因。
RocketMQ不保证消息不重复,如果你的业务需要保证严格的不重复消息,需要你自己在业务端去重。
rocketmq怎么保证数据不会重复_rocketmq如何保证消息不丢失相关推荐
- rocketmq怎么保证数据不会重复_RocketMQ保证信息有序性和防止重复
分布式开放消息系统(RocketMQ)的原理与实践 分布式消息系统做为实现分布式系统可扩展.可伸缩性的关键组件,须要具备高吞吐量.高可用等特色.而谈到消息系统的设计,就回避不了两个问题:java 消息 ...
- rocketmq怎么保证数据不会重复_阿里架构师亲授:Kafka和RocketMQ的消息复制实现的差异点在哪?...
众所周知,消息队列在收发两端,主要是依靠业务代码,配合请求确认的机制,来保证消息不会丢失的.而在服务端,一般采用持久化和复制的方式来保证不丢消息. 把消息复制到多个节点上,不仅可以解决丢消息的问题,还 ...
- Kafka(十一) 如何保证数据的不重复和不丢失
数据不丢失 1)从生产端:acks = -1,(ack应答机制)从生产端到节点端,当所有isr集合里的节点备份完毕后返回成功: 2)从节点端:每个partition至少需要一个isr节点(同步)存活保 ...
- mysql 索引不重复的值,【锁】在数据库无法使用唯一索引时如何保证数据的不重复?...
前言 之前数据库的用户表的用户名.手机号码.邮箱都是设置了唯一索引,因此不需要考虑重复的问题.然而,由于手机号码和邮箱都可以为 null,而太多的 null 会影响索引的稳定性,因此去掉唯一索引并将默 ...
- Jmeter中使用循环如何保证数据不重复
在Jmeter中设置并发为S,循环次数为N时,参数化文件可能被重复读取N次,无法保证每次读取的数据均不一样,此处介绍保证数据不重复的方法. 启动jmeter 新建一个线程组 在线程组下添加一个CSV ...
- 消息队列面试连环问:如何保证消息不丢失?处理重复消息?消息有序性?消息堆积处理?...
大家好,我是 yes. 最近我一直扎在消息队列实现细节之中无法自拔,已经写了 3 篇Kafka源码分析,还剩很多没肝完.之前还存着RocketMQ源码分析还没整理.今儿暂时先跳出来盘一盘大方向上的消息 ...
- RocketMQ的Consumer详解之重复消息的解决方案
重复消息的解决方案 造成消息重复的根本原因是:网络不可达.只要通过网络交换数据,就无法避免这个问题.所以解决这个问题的办法就是绕过这个问题.那么问题就变成了:如果消费端收到两条一样的消息,应该怎样处理 ...
- 如何保证消息不被重复消费~~~~~(如何保证消息队列的幂等性)
分析:这个问题其实换一种问法就是,如何保证消息队列的幂等性?这个问题可以认为是消息队列领域的基本问题.换句话来说,是在考察你的设计能力,这个问题的回答可以根据具体的业务场景来答,没有固定的答案. 回答 ...
- RocketMQ如何保证消息不丢失? 如何快速处理积压消息?
文章目录 1. 哪些环节会有丢消息的可能? 2. 消息生产阶段如何保证消息不丢失 2.1 同步发送 2.2 采用事务消息 3. Broker如何保证接收到的消息不会丢失 4. 消费者如何确保拉取到的消 ...
最新文章
- python字符串操作_浅谈Python 字符串特有的操作方法
- [译]NeHe教程 - 你的第一个多边形
- Java黑皮书课后题第2章:2.9(物理:加速度)平均加速度定义为速度的变化量除以这个变化所用的时间,编写程序,提示用户输入以米/秒为单位的起始速度v0,以米/秒为单位的终止速度v1,显示平均加速度
- nullnullanimate用法
- 判断字符为空_算法题:字符串转换整数 (atoi)
- 在Reporting Services (RDL)中自动生成大量列
- EXCEL 查漏补缺内容
- uniapp 复制 粘贴功能
- lvgl chart
- Vue中Class和Style几种v-bind绑定的用法-详解案例
- pyqt5学习笔记——QListView与QListWidget
- 硬盘/分区克隆:怎么无损迁移老硬盘数据到新硬盘?
- 把多列的迭代次数问题化简为单列问题
- 微信小程序原生tabBar基础模板
- Thingsboard 开源 IoT 物联网平台入门
- 对比Hadoop,Spark受多方追捧的原因
- 19年暑假实习,我霸面了鹅厂两次。
- 星速配资:创业板指强势反弹 白马消费强势反攻
- PHP --- 数组去重
- Jsp+Ssh+Mysql实现的羽毛球馆预约管理系统
热门文章
- Django中related_name的作用
- 非线性回归模型(part1)--神经网络
- JAVA错误日志(part1)--编码GBK的不可映射字符
- 转:小波函数介绍(wden)
- css3 media query orientation,CSS3之media query
- SAP 电商云 Spartacus UI B2B checkout 点击 Continue 不能跳转到下一页面
- 部署在SAP Cloud Platform CloudFoundry环境的应用如何消费SAP Leonardo机器学习API
- 如何创建 Angular library 并在生产环境中消费
- 使用 Excel 读取 SAP ABAP CDS View 通过 ODBC 暴露出来的数据
- Angular jasmine单元测试框架spec的运行时数据结构