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会把该消息做重新的投递,从而做到了消息的重置机制,消息的重试后面在分析

安全性保障:跳转

重复消费:跳转

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CS224W6.3——图深度学习

在这篇中,将介绍图神经网络的架构。关键思想是,在GNNs中,根据局部网络邻域生成节点嵌入。gnn通常由任意数量的层组成,而不是单层,以集成来自更大上下文的信息。介绍了如何使用gnn来解决优化问题,以及它强大…

在Android上使用Jetpack Compose定制下拉刷新

在Android上使用Jetpack Compose定制下拉刷新 在Jetpack Compose中向LazyList添加下拉刷新非常简单。说真的,只需几行代码。然而,默认的外观和感觉并不是那么令人满意。我们希望做得更好一些,类似于iOS版本:当用户向下拉动列表时…

[Go语言]SSTI从0到1

[Go语言]SSTI从0到1 1.Go-web基础及示例2.参数处理3.模版引擎3.1 text/template3.2 SSTI 4.[LineCTF2022]gotm1.题目源码2.WP 1.Go-web基础及示例 package main import ("fmt""net/http" ) func sayHello(w http.ResponseWriter, r *http.Request) { // 定…

微服务 Spring Cloud 6,用了这么多年Docker容器,殊不知你还有这么多弯弯绕

目录 一、神之容器 Docker二、Docker架构图1、Docker Client 客户端2、Docker Daemon 守护进程3、镜像(Image)4、Docker Driver 驱动模块5、Docker Graph内部数据库6、Docker Libcontainer函数库7、Docker Container 容器实例 三、Docker安装1、卸载Dock…

Sui学术研究奖公布,资助研究者探索人工智能、能源市场和区块链游戏

Sui基金会高兴地宣布首轮Sui学术研究奖(SARAs)的获奖者。SARAs计划提供资助,支持推动Sui区块链技术的研究。学术和研究界对我们的初次征集呈现出大量高质量的提案。 已接受的九个提案涵盖了各种主题,如token经济学、智能合约机制…

微信个人号二次开发之检测好友

简要描述: 检测好友状态 请求URL: http://域名地址/userPrivacySettings 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必选…

【解刊】IEEE(trans),中科院2区,顶刊,CCF-A类,圈外人别想投?

计算机类 • 好刊解读 今天小编带来IEEE旗下计算机领域好刊的解读,如有相关领域作者有意向投稿,可作为重点关注!后文有真实发表案例,供您投稿参考~ 01 期刊简介 IEEE Transactions on Computers ☑️出版社:IEEE …

跨境电商商城源码:实现多语言、多货币、多商户入驻的全面解决方案

随着全球电子商务的迅猛发展,越来越多的商家和消费者选择在跨境电商平台上进行交易。为了满足不同国家和地区的需求,多语言、多货币、多商户入驻已成为跨境电商平台的核心竞争力。本文将为您介绍如何通过跨境电商商城源码实现这些功能,帮助您…

人工智能与发电玻璃:未来能源技术的融合

人工智能与发电玻璃:未来能源技术的融合 摘要:本文探讨人工智能与发电玻璃这两项技术的结合,共同推动能源领域的创新。本文将介绍发电玻璃工作原理及应用、人工智能在发电玻璃的应用领域以及共同为可持续能源发展做出贡献。 一、引言 随着科…

一款好用的jpeg分析软件 JPEGsnoop

最近解码器解码jpeg的时候出了问题,为了追踪问题,找到了这款免费好用的jpeg分析软件- JPEGsnoop。 顶礼膜拜。 贴上链接地址: https://github.com/ImpulseAdventure/JPEGsnoop/releases 上面已经有编译好的win10 exe了 下载后解压&#x…

亚马逊鲲鹏系统强大的指纹系统可有效防止账号关联

亚马逊鲲鹏系统最新的防指纹技术支持绑定不同的代理IP,可以根据ip创建不同的指纹环境,让账号伪装成来自不同地点、不同设备的流量,每个账号环境隔离开来,实现了完全独立的操作任务,避免了账户指纹关联和操作轨迹关联。…

基于springboot实现生鲜超市管理的设计与实现系统【项目源码】

基于springboot实现生鲜超市管理的设计与实现系统演示 Java技术 Java是由Sun公司推出的一门跨平台的面向对象的程序设计语言。因为Java 技术具有卓越的通用性、高效性、健壮的安全性和平台移植性的特点,而且Java是开源的,拥有全世界最大的开发者专业社群…

回顾 — SFA:简化快速 AlexNet(模糊分类)

模糊图像的样本 一、说明 在本文回顾了基于深度学习的模糊图像分类(SFA)。在本文中:Simplified-Fast-AlexNet (SFA)旨在对图像是否因散焦模糊、高斯模糊、雾霾模糊或运动模糊而模糊进行分类。 二、大纲 图像模糊建模简要概述简化快速 AlexNet…

【Git】Git的GUI图形化工具ssh协议IDEA集成Git

一、GIT的GUI图形化工具 1、介绍 Git自带的GUI工具,主界面中各个按钮的意思基本与界面文字一致,与git的命令差别不大。在了解自己所做的操作情况下,各个功能点开看下就知道是怎么操作的。即使不了解,只要不做push操作,…

测量均值频率、功率、带宽

测量均值频率、功率、带宽 生成以 1024 kHz 采样的啁啾信号的 1024 个采样点。啁啾信号的初始频率为 50 kHz,采样结束时达到 100 kHz。添加高斯白噪声,使信噪比为 40 dB。 nSamp 1024; Fs 1024e3; SNR 40;t (0:nSamp-1)/Fs;x chirp(t,50e3,nSamp/…

图像实时采集系统

本方案主要在于解决图像实时采集系统对算法校正的仿真实验,以及采集卡接收电路的验证。 由于图像实时跟踪处理系统需要大量的外场景实验,大部分时候只能通过采集的现场图像以在电脑软件中读取图片的形式来进行验证算法,而无法通过采集卡对接…

DMP大湾区工博会开幕在即,狂撒100万福利,邀您与2200+展商面对面

截止11月9日,DMP大湾区工博会2023已迎来超100万人关注。大湾区工博会将于11月27-30日在深圳国际会展中心(宝安)举办。作为工业制造行业的风向标,展会将带来2200多家全球参展企业、40多场主题演讲、数千项行业新品技术。 本届DMP大湾区工博会,…

学习c#的第九天

C# 可空类型&#xff08;Nullable&#xff09; C# 可空类型&#xff08;Nullable&#xff09; 可空类型允许我们在值类型中包含 null 值&#xff0c;这在处理数据库查询结果或需要表示缺失值的情况时非常有用。 声明一个可空类型的语法如下&#xff1a; < data_type>…

【rl-agents代码学习】01——总体框架

文章目录 rl-agent Get startInstallationUsageMonitoring 具体代码 学习一下rl-agents的项目结构以及代码实现思路。 source: https://github.com/eleurent/rl-agents rl-agent Get start Installation pip install --user githttps://github.com/eleurent/rl-agentsUsage…

大数据-之LibrA数据库系统告警处理(ALM-12041 关键文件权限异常)

告警解释 系统每隔一个小时检查一次系统中关键目录或者文件权限、用户、用户组是否正常&#xff0c;如果不正常&#xff0c;则上报故障告警。 当检查到权限等均正常&#xff0c;则告警恢复。 告警属性 告警ID 告警级别 可自动清除 12041 严重 是 告警参数 参数名称 …