RocketMQ 如何保证消息正常【投递】和【消费】

消息整体处理过程,这里我们将消息的整体处理阶段分为3个阶段进行分析:

1Producer发送消息阶段。
2Broker处理消息阶段。
3Consumer消费消息阶段。

一、Producer发送消息阶段

1、安全机制保障1,发送方式。

1、同步发送
2、异步发送
3Oneway发送:Oneway 方式只负责发送请求,不等待应答

2、安全机制保障2

如果发送消息失败或者超时,则重新发送。
发送重试源码如下,本质其实就是一个for循环,当发送消息发生异常的时候重新循环发送。默认重试3次,重试次数修改。

3、安全机制保障3

broker提供多master模式,即使某台broker宕机了,保证消息可以投递到另外一台正常的broker上

二、Broker处理消息阶段

1、安全机制1:同步/异步 【刷盘】的策略

当消息投递到broker之后,会先存到page cache,然后根据broker设置的刷盘策略是否立即刷盘,
也就是如果刷盘策略为异步,broker并不会等待消息落盘成功就会返回【producer成功】,还只是保存到了page cache, 
也就是说当broker所在的服务器突然宕机,则会丢失部分页的消息。【这就是异步刷盘带来了的问题】

安全机制2:提供主从模式,同时主从支持同步双写

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

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

缺点:比较慢,而且如果单边失败,引发其他问题。

三、Consumer消费消息阶段

consumer默认提供的是【At least Once】机制
何为【At least Once】:就是Consumer先pull消息到本地,消费完成后,才向服务器返回ack。

通常消费消息的ack机制一般分为两种思路:
(1)先提交后消费;(可以解决重复消费的问题但是会丢失消息)
(2)先消费,消费成功后再提交;

因此Rocketmq默认实现的是思路二,由各自consumer业务方保证幂等来解决重复消费问题。

消费消息重试机制,RocketMQ本身提供了重新消费消息的能力。但是会有重复消费的问题。

重复消费的问题出现原因
RocketMQ是以【consumer group+queue】来确认消息消费进度,通过【gruop+offset】来标记【queue】消费进度,
消费成功之后都会返回一个ack消息告之broker更新offset,但是RocketMQ并不是按一条一条消息来做ack,
而是根据一次拉取批量来做消息ack
如一次从broker拉去10条消息,就按照10条消息整体做offset,为方便理解下面先按照10条来分析
如上一次的offset为101,本次拉取了10调消息,偏移量从101-110
每一条消息消费成功会按照当前消息最小的offset来更新本地的消费进度,怎么理解这句话,

例如:103消息先消费完成,但是101还没有消费完成(消费失败也算作消费完成),这时候更新还是按照101的偏移量来更新本地偏移量;直到所有的消息都消费完成,110这条消息消费完成的时候才会把偏移量更新为110,再通过定时任务将本地偏移量更新到broker(假设恰好更新偏移量等定时任务触发)。

RocketMQ按批次更新进度好处是不需要每一条消息都需要做ack操作,提升了效率,但是随之产生了2个问题:
1、某一条失败,导致整体失败,然后又重行全量消费一次。
2、但是实际是失败的消息,如果处理。


问题1:
如果这一批消息中的101消息由于一些原因一直没有消费完成,即使其它的9条消息都消费完成了,
broker的消费进度依然偏移到101,如果此时该consumer宕机或者实例被kill,该queue通过负载均衡策略会重新被分配给
其它的consumer,这个时候从broker拉去的偏移量为101开始消费,但是实际102-1099条消息已经消费完成,
造成102-1099条消息重复消费

解决方案:
3.6版本之前RocketMQ没有给出解决方案,官方强调业务方【需要自己实现消息幂等】逻辑,但是为了避免大量的出现消息重
复消费的问题,RocketMQ也做了一些限制,如果本地的消息量达到2000之后,不会在拉取新的消息,也就是即使出现上面的
极端情况,也只会造成最多1999条消息重复消费。

3.6之后的版本RocketMQ给出了一个解决方案(治标不治本),在消费端设置了一个消费超时时间
【consumeTimeout = 15min】 原理是,RocketMQ启动了一个定时任务来检查所有的消息的消费情况,在消费开始的时
候会记录消息【消费开始时间】,每隔consumeTimeout时间去检查所有消息是不是消费完成了,如果还没有消费完
成并且时间超过了consumeTimeout配置的时间,就当作【消费成功,但是处理失败】(也算作消费完成),既然消费完成了,
自然会把本地消费进度更新到上例中的110,再通过定时同步机制将本地进度同步到broker,达成本地和broker端一致的效果

consumeTimeout支持业务自己配置,为什么说治标不治本,因为始终还是出现2*consumeTimeout时间(比如第一次任务在120分,101消息从121分开始消费,到1230分才会发现超时,如果这个时候宕机)的消息会出现无法完成确认造成消息重复消费。


问题2:
既然是按批量来更新消费进度,但是那些虽然消费完成但是实际是【处理失败】的消息(主动返回【RECONSUME_LATER】和
【抛出异常】的)的消息是如何处理的?

rocketmq在消息消费失败的消息会单独把该消息的msgid、偏移量等信息通过rpc调用通知给broker,那broker会把该消息做重新的投递,从而做到了消息的重置机制,消息的重试后面在分析

安全性保障:跳转

重复消费:跳转

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/138617.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

展会预告 | 图扑邀您相约高交会-全球清洁能源创新博览会

第二十五届中国国际高新技术成果交易会(简称“高交会”)将在深圳盛大开幕。高交会由商务部、科学技术部、工业和信息化部、国家发展改革委、农业农村部、国家知识产权局、中国科学院、中国工程院和深圳市人民政府共同举办。是目前中国规模最大、最具影响力的科技类展会。 图扑软…

【沐风老师】3dMax一键多边形窗插件PolyWindow使用教程

3dMax一键多边形窗插件使用教程 3dMax一键多边形窗插件PolyWindow,将选择的多边形面一键转化为窗模型。你可以通过编辑多边形的线框(边)来定义窗子的分格形状,这款插件可以大大提高艺术家建筑建模、室内建模制作窗子的速度。 可适…

第一章:线性查找

系列文章目录 文章目录 系列文章目录前言一、线性查找二、实现查找算法三、循环不变量四、复杂度分析五、常见复杂度六、测试算法性能总结 前言 从线性查找入手算法。 一、线性查找 线性查找目的在线性数据结构中一个一个查找目标元素输入数组和目标元素输出目标元素所在的索…

新能源汽车三电系统上的VDA接口在操作空间有限时如何快速密封与连接

针对新能源汽车三电系统上的VDA接口的快速密封与连接,格雷希尔GripSeal快速接头有其对应的G90系列,但随着现在有些新能源汽车体型越来越小,其三电系统的体积也越来越小,相对应的它们各个接口之间的距离也就越来越近,其…

【MySQL】对表结构进行增删查改的操作

表的操作 前言正式开始建表查看表show tables;desc xxx;show create table xxx; 修改表修改表名 rename to对表结构进行修改新增一个列 add 对指定列的属性做修改 modify修改列名 change 删除某列 drop 删除表 drop 前言 前一篇讲了库相关的操作,如果你不太懂&…

数字双向码、密勒码、传号反转(CMI)码、AMI、HDB3的编码规则和功率谱解析+眼图

数字双向码、密勒码、传号反转(CMI)码、AMI、HDB3的编码规则和功率谱解析眼图 本文主要涉及数字双向码、密勒码、传号反转(CMI)码、AMI、HDB3的编码规则,优缺点和功率谱解析以及眼图的分析。关于简单二元码大家可以参考简单二元码…

机带RAM:16G(可用2G)

文章目录 机带RAM 16G(可用2G)一 、问题描述二、解决办法2.1 最大内存设置 2.2 系统激活重启 机带RAM 16G(可用2G) 一 、问题描述 戴尔商务计算机 Windows11系统 16GB内存 之前一直是正常使用的,突然有一天内存占用率…

150. 逆波兰表达式求值

150. 逆波兰表达式求值 原题链接:完成情况:解题思路:参考代码:错误经验吸取 原题链接: 150. 逆波兰表达式求值 https://leetcode.cn/problems/evaluate-reverse-polish-notation/description/ 完成情况&#xff1a…

Mac笔记本打开Outlook提示:您需要最新的版本的Outlook才能使用此数据库

Mac笔记本打开Outlook提示:您需要最新的版本的Outlook才能使用此数据库 故障现象: 卸载旧的office安装新版的office,打开outlook提示:您需要最新的版本的outlook才能使用此数据库。 故障截图: 故障原因:…

中小企业数字化转型进程加速,CRM系统前景如何?

自疫情不断反复之后,中小企业数字化转型进程开始加速。作为当下最热门的企业级应用,CRM客户管理系统的前景还是被看好的。相比于美国企业CRM系统7成的使用率,中国的CRM市场还有很大的发展空间。下面来详细说说,CRM系统的前景如何&…

在R中通过正则化表达式提取向量中的正负数

目录 一、实现代码&#xff1a; 二、运行结果&#xff1a; 三、str_extract()函数介绍材料 一、实现代码&#xff1a; install.packages("stringr") library(stringr) # 创建一个包含正负小数的向量 vec <- c("1.5", "-2.7", "3.8&qu…

Linux系统中的静态库和共享库,以及一些计算机的基础知识

目录 1.库文件 2.静态库 3.共享库 4.静态库与共享库的区别 5.计算机基础知识 6.进程的基础知识 7.主函数的三个参数 1.库文件 1).库文件库是一组预先编译好的方法的集合;Linux系统存储库的位置一般在/lib 和 /usr/lib (64位系统/usr/lib64)库的头文件放在/usr/include 2…

纯CSS实现魔法渐变边框卡片

如图所示&#xff0c;这是一个很炫酷的卡片效果&#xff0c;关键效果在于卡片的边框呈渐变色变化着&#xff0c;在网页中有这样一个卡片相信可以极大的增强用户体验交互。本次文章将解读如何使用纯CSS实现这个炫酷的卡片效果。 基于上面的动图可以分析出以下是本次实现的主要几…

【java零基础入门到就业】第五天:java语言的发展和java语言的具体现实应用场景

文章目录 1、java 语言的发展2、java能干什么2.1 java的三大分类2.2 java能做什么1、java 语言的发展 Java 是一种广泛使用的编程语言,经历了多个阶段的发展。以下是 Java 语言的主要发展阶段: 诞生(1995 年): Java 由 Sun Microsystems(后来被 Oracle 收购)的 James …

YOLO的bounding boxes

YOLO使用了 77 网格 (SS)、2 个bounding boxes (B2) 和 20 个类别 ©。 1.YOLO将输入的图片resize成448 x 448&#xff0c;并且为 S x S&#xff08;S 7&#xff09;个grid&#xff0c;如果物体的中心落入该grid中&#xff0c;那么该grid就需要负责检测该物体。 2.对于每…

关于ASJ系列剩余电流动作继电器的功能介绍-安科瑞 蒋静

1.概述 在工业应用中&#xff0c;剩余电流继电器与外部剩余电流互感器结合使用以检测和评估接地故障电流。它们也可以与保护装置结合使用&#xff0c;以实现电路的断开&#xff0c;从而实现对线路和人员的保护。 2.剩余电流的定义以及危害 剩余电流&#xff0c;是指低压配电线…

制造业工厂MES系统中的设备管理模块

随时工厂数字化建设的大力推进&#xff0c;设备管理的效率得到了很大的提升&#xff0c;特别是作为机加工企业&#xff0c;设备是整个企业非常重要的核心资产。下面是万界星空科技MES系统中的设备管理模块介绍&#xff1a; 1、MES设备管理任务模型 制造企业总是期望设备能够在…

龙芯loongarch64安装grpcio失败解决办法

什么是gRPC gRPC 一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统用protocol buffers IDL定义一个服务,指定能够被远程调用的方法及其参数和返回值类型 使用protocol buffers 编译器插件,将服务定义的.proto文件,编译成客户端和服务端的代码 …

[EFI]技嘉 Z490 VISION G i5-10500 电脑 Hackintosh 黑苹果引导文件

硬件配置 硬件型号驱动情况主板技嘉 Z490 VISION G CLPC controller Z490芯片组&#xff09;处理器英特尔 Core i5-10500 3.10GHz 六核已驱动内存16GB&#xff08; 威到DDR42655MHz8GBx 2〕已驱动硬盘SSDSC2BB150G7R (150 GB/ 国态硬盘&#xff09;已驱动显卡AMD Radeon RX 58…

2024 AIGC 规划:探索交互体验变革及 智能硬件基础设施篇

TL;DR Run LLM/Embedding on Android: https://github.com/unit-mesh/android-semantic-search-kitInference SDK&#xff1a;https://github.com/unit-mesh/inference 正文&#xff1a; 在过去的一年时间里&#xff0c;国内外大中型公司都在探索、引入了 GenAI / AIGC&#xf…