MQ系列12:如何保证消息顺序性
2023-06-07 23:53:35 来源:博客园
MQ系列1:消息中间件执行原理MQ系列2:消息中间件的技术选型MQ系列3:RocketMQ 架构分析MQ系列4:NameServer 原理解析MQ系列5:RocketMQ消息的发送模式MQ系列6:消息的消费MQ系列7:消息通信,追求极致性能 MQ系列8:数据存储,消息队列的高可用保障MQ系列9:高可用架构分析MQ系列10:如何保证消息幂等性消费MQ系列11:如何保证消息可靠性传输
1 介绍消息的有序性在很多业务场景中占有很重要的位置。比如购物场景,需要按照 创建订单 --> 订单付款 --> 完成订单 顺序执行。又比如出行场景,接单 --> 接送到达目的地 --> 付款 --> 完成订单。这种是严格按照顺序执行的,这样的顺序消费才不会出问题,而且各个订单之间是互相独立和并行执行的。所以,在MQ中,如何稳定地保证顺序性消息处理,是一个不可避免的话题。
(资料图)
消息的有序执行,一般不是单个组件的能力。而是整个消息从生产,排队,存储到消费都是有序的,比如上面提到的购物和出行场景。这就要求我们在消息队列(如果是Kafka,还是RocketMQ、RabbitMQ)中,保证以下前提:
消息生产的有序性:即生产者组件有序发送消息消息入出队列的有序性:即消息是按照进入的先后顺序排队列放的,遵循FIFO原则。消息的存储的有序性:与上一点一致,部分场景下为了提高可用,就是要持久化到磁盘,这时候应该遵循有序存放,才能保证后续有序消费消息消费的有序性:即按照顺序进行消费。又分为全局顺序消息与部分顺序消息,全局是指Topic下的所有消息都要保证顺序;部分顺序消息保证每一组消息被顺序消费即可。这边还有个问题,如果想让全局都是顺序性消费,那么只能用一个消费者去消费队列(一般来说也是单个生产者),这是会严重影响整体性能的,一般没这个,都是分组顺序执行消费的。
2.1 消息生产的有序性要保证整个消息队列的有序性执行,首先要保证消息生产的有序性。RocketMQ在Broker中防止了很多Topic,主题(Topic)可以看做消息的归类,我们将消息进行类型划分,相同类型的消息称为一个 Topic。比如我们在淘宝或京东上购买商品的的过程,就可能产生:购物车消息、交易消息、物流消息等,1条消息必然归属于1个 Topic 。1个 Topic可以有0 ~ n 个生产者向其发送消息;也可以被 0~n 个消费者订阅和处理,于是就有出现了生产者组和消费者组,如下图:
或者同一个Topic中,创建不同的Queue,同一个消息生产者将消息隔离发送到不同的Queue中:
按照上述的模式,同理,我们只需要保证一组相同的消息按照给定的顺序存入同一个队列中,就能保证生产者有序存储,比如一次完整的消费过程:创建订单、付款、完成订单按照顺序在一个队列(Queue)中执行那就可以了。
★ 同时我们要保证同一组的消息在消息生产的时候投送到一个组中。这个相对来说不难,可以这么做:
比如一个订单的多个子消息的父订单号是一致,我们把这些消息按照订单号取模,投送到对应的Queue中就行了,比如 订单号 % 队列数量( 163105015 % 9)发送消息自定义消息标签(消息标签可以用队列编号命名),一组消息使用同一个标签,改组标签对应的消息都投向标签所在的队列。★ 业务程序方面,必须使用同步发送的方式,这样才能保证生产者发送的消息有序,否则按照FIFO的原则,很可能 订单完成会被先消费。但是我们业务程序,比如Java代码中为了提升性能,可能使用多线程的模式进行事件触发。多线程下保证生产者顺序性,可以使用锁并配合 spring的publish event(按照顺序执行的内部队列),持久化之后,再按照先进先出的顺序推送消息进入MQ中。可以参考下 ,大概就是将你的事件进行顺序化一下。
★ 上述方法也不能完完全全的避免顺序化执行。如果broker服务发生故障,或者消息发生丢失,都有可能导致事件消费不完整,出现不一致的问题。
2.2 消息有序性存储Broker 存储架构采用文件存储机制(类似Kafka),即直接在磁盘上使用文件来保存消息,而不是采用Redis或者MySQL之类的持久化工具。它会把消息存储所属相关的文件存储在ROCKETMQ_HOME下,包含三个部分:
CommitLog 消息元数据ConsumeQueue 消息逻辑队列IndexFile 索引文件存储消息的元数据,所有消息都会顺序存入到CommitLog文件中。ConsumeQueue是指存储消息在CommitLog上的索引,一个MessageQueue一个文件,记录当前MessageQueue被哪些消费者组消费到了哪一条CommitLog。所以一切都是顺序性操作下来的,而且按照 MessageQueue 做了隔离了,不用担心乱序的问题。详细参考 《MQ系列8:数据存储,消息队列的高可用保障》
2.3 消息消费的有序性最后一步就是消费的有序性了,既然消息生产和消息持久化都可以做到有序性。那么只要保证消费的有序性,就能保证整个消息队列的有序执行。这边以RocketMQ为例子,RockerMQ采用MessageListener 回调函数进行监听,监听到消息之后进行数据处理。MessageListener主要提供了两种消费模式,如下:
有序消费模式MessageListenerOrderly并发消费模式MessageListenerConcurrently其中有序消费模式有序消费模式MessageListenerOrderly可以保证按照顺序进行消息处理。但是消费的业务代码实现是多线程并行的,依然是无法保证的。实际上RocketMQ也是这么做的,MessageListenerConcurrently拉到消息之后会提交到线程池去消费,而MessageListenerOrderly则是通过分布式锁和本地锁保证同时只有一条线程去消费一个队列(Queue)上的数据。这种消费模式就是使用以下3把锁来确保顺序性:
broker端的分布式锁messageQueue的本地synchronized锁ProcessQueue的本地consumeLock3 总结要消息的顺序性消费:需要保持先后顺序的消息放到同一个消息队列中(kafka中就是partition,rabbitMq中就是queue),然后使用线程池消费的时候使用分布式锁和本地锁保证同时只有一条线程去消费一个队列(Queue)上的数据。
标签:
相关阅读
- (2023-06-07)MQ系列12:如何保证消息顺序性
- (2023-06-07)系统教程篇:让windows系统自动关闭停止响应的程序-天天热推荐
- (2023-06-07)实时焦点:江西省出台举措加快推进农业产业化高质量发展
- (2023-06-07)环球今头条!安信证券A股中期策略:市场处于磨底阶段但具备较强支撑 第二波TMT正在酝酿开启
- (2023-06-07)(10)贴心服务 助力高考
- (2023-06-07)环球快播:什么是Project xCloud 您需要知道的一切
热点推荐
- (2023-06-07)MQ系列12:如何保证消息顺序性
- (2023-06-07)Lunaz展示其电动阿斯顿马丁DB6EV-即时焦点
- (2023-06-07)系统教程篇:让windows系统自动关闭停止响应的程序-天天热推荐
- (2023-06-07)龙舟赛催生旅游热 多彩活动喜迎八方客
- (2023-06-07)天天最资讯丨建研设计:公司有承接新型城镇化项目
- (2023-06-07)实时焦点:江西省出台举措加快推进农业产业化高质量发展
- (2023-06-07)中文传媒(600373)6月7日主力资金净买入3416.19万元
- (2023-06-07)环球今头条!安信证券A股中期策略:市场处于磨底阶段但具备较强支撑 第二波TMT正在酝酿开启
- (2023-06-07)福特蒙迪欧1.5T版本将上市!起售价或降至15万以内 当前消息
- (2023-06-07)(10)贴心服务 助力高考
- (2023-06-07)杰创智能:公司暂无人脑工程相关技术 天天精选
- (2023-06-07)环球快播:什么是Project xCloud 您需要知道的一切
- (2023-06-07)经典互联网是否仍然重要?
- (2023-06-07)以税为“笔”绘就乡村振兴美好新蓝图
- (2023-06-07)国网陇南供电公司:机械化施工助重点工程建设
- (2023-06-07)安源煤业(600397)6月7日主力资金净买入523.40万元
- (2023-06-07)热点评!高考今日进行 请您开启“静音”
- (2023-06-07)天天头条:宝光股份(600379)6月7日主力资金净卖出51.65万元
- (2023-06-07)杰创智能董秘回复:公司对云计算领域未来发展情况整体持积极乐观的态度-世界即时
- (2023-06-07)环球看点!盘江股份(600395)6月7日主力资金净买入928.35万元
- (2023-06-07)国网天津滨海公司:全力保障高考电力可靠供应
- (2023-06-07)要闻速递:【期市盘面】甲醇跌超3%位居跌幅榜首!一品种主力资金流入近6亿
- (2023-06-07)亚通精工:公司汽车零部件业务主要是为整车厂提供冲压及焊接零部件,主要客户均为知名大型整车厂,是上汽通用、上汽集团、理想汽车、中国重汽、中国一汽、北汽福田等客户的一级供应商
- (2023-06-07)烧胎对轮胎损伤有多大_烧胎怎么操作
- (2023-06-07)【环球播资讯】控制器维修全套视频教程_控制器维修
- (2023-06-07)中盐化工(600328)6月7日主力资金净买入463.20万元
- (2023-06-07)宁波韵升(600366)6月7日主力资金净卖出139.10万元 世界快报
- (2023-06-07)全球视讯!蔡徐坤,王艺瑾,杨幂,ab白鹿,徐开骋
- (2023-06-07)“三个注重”提升人才工作效能 天天通讯
- (2023-06-07)亿道信息受邀参加「欢乐童年·爱在福田」天使宝宝六一嘉年华 天天速看
- (2023-06-07)每日看点!首都在线:文昌超算中心项目按计划稳步推进中
- (2023-06-07)智立方:将不断加大研发投入 环球快播报
- (2023-06-07)奥海科技:国际化和品牌是坚定不移的战略方向 天天播报
- (2023-06-07)舒泰神:公司目前生产经营活动正常 每日报道
- (2023-06-07)英镑/美元行情综述(2023年6月7日)
- (2023-06-07)中矿华沃每10股派现0.5元 共计派发现金红利100万-环球短讯
- (2023-06-07)大理市2863个国资收费车位,高考期间送考车辆可免费停!
- (2023-06-07)郑州城市防洪排涝监测预警中枢系统正式投用
- (2023-06-07)国恩股份:子公司益青生物“新型空心胶囊智能产业化项目”目前正在按计划进度进行建设,预计将于今年三季度实现部分试生产 焦点消息
- (2023-06-07)江西省委常委、南昌市委书记李红军一行调研南昌维科
- (2023-06-07)快报:卡霍夫卡水电站大坝遭破坏,会有哪些影响?
- (2023-06-07)今日热闻!香港弦乐团内地巡演(哈尔滨站)在哈尔滨大剧院举办
- (2023-06-07)全球播报:一地通报!发现2例,已隔离
- (2023-06-07)全球简讯:江南高纤(600527)6月7日主力资金净买入42.56万元
- (2023-06-07)环球今热点:文一科技(600520)6月7日主力资金净卖出94.53万元
- (2023-06-07)视点!恒力石化(600346)6月7日主力资金净卖出2877.81万元
- (2023-06-07)世界关注:2023世界人工智能大会将在沪举办 OpenAI、英伟达等与会
- (2023-06-07)惠城环保:公司2023年建成投产的3万吨fcc催化剂回收再利用项目处置能力30000吨,是新增产能,并不是新增业务-看点
- (2023-06-07)全球今亮点!京东超市618主推日战报:新奇特商品呈现6大趋势 14大国货销售领先 最高增长40倍
- (2023-06-07)新莱福:公司自主研发热敏电阻芯片
- (2023-06-07)环球关注:德必集团:首个元宇宙创意园区办公场景在上海上线
- (2023-06-07)中科创达:将不断赋能智能化产业链的发展
- (2023-06-07)中科创达:与车厂的合作在积极推进和进展中 播报
- (2023-06-07)摩尔多瓦前总统彼得·鲁钦斯基莅临郎酒:世界级酒庄 牵起葡萄酒与白酒美妙情谊|全球最资讯
- (2023-06-07)昔日“光脚走”转场模式变为机械化牛羊转场 牧民更轻松-当前讯息
- (2023-06-07)全球观速讯丨曝一加11原神定制版手机6月推出
- (2023-06-07)每日快看:硅谷“女版乔布斯”开始服刑 “滴血验癌”技术神话就此终结?
- (2023-06-07)摩通:放宽一线城市限购料对内房销售影响轻微
- (2023-06-07)当前快播:领导看了给你加薪!python +ddt+excel 一招鲜,接口自动化测试轻松搞定,测试报告惊艳四座!
- (2023-06-07)浑身解数的意思(浑身解数)
- (2023-06-07)发生可燃气体火灾时(是利用可燃气体同氧气混合燃烧所产生火焰分割材料的热切割) 环球视点
- (2023-06-07)手机多人生存联机手游推荐 多人一起组队开启求生之旅
- (2023-06-07)“绵阳”三台县委统战部召开信息宣传暨实践理论创新工作专题会
- (2023-06-07)天天热讯:金百泽:研发了400G光模块PCB关键工艺技术
- (2023-06-07)我国一季度汽车出口107万辆 还带火了这个行业 天天热门
- (2023-06-07)十恶是哪十恶_十善是哪十善-环球速递
- (2023-06-07)Lunaz展示其电动阿斯顿马丁DB6EV_焦点播报
- (2023-06-07)热文:三亚旅文集团8亿元中期票据将付息 利率4.27%
- (2023-06-07)减轻房租压力!在济南租房可以享受这些公积金利好 每日热讯
- (2023-06-07)繁星 繁|世界报资讯
- (2023-06-07)世界聚焦:【收评】白糖日内上涨1.48% 机构称白糖短期内外出现劈叉
- (2023-06-07)深水规院06月07日主力资金大幅流出-时讯
- (2023-06-07)北京电信多条千兆专线护航通信展览会 全力做好通信保障服务
- (2023-06-07)环球快看点丨未来几年,3个因素将推动国内高品质医药纸盒包装市场增长
- (2023-06-07)世界看热讯:硕贝德:子公司拟2.55亿元投建新能源线束生产项目
- (2023-06-07)广西首张六堡茶制作专项能力证书发放
- (2023-06-07)天天热推荐:凌海市气象局发布雷雨大风黄色预警【Ⅲ级/较重】【2023-06-07】
- (2023-06-07)贝莱德中国区负责人汤晓东离职 陈蕙兰将接管在岸业务 世界看热讯
- (2023-06-07)6月7日西北地区地炼汽柴油报价暂稳 时讯
- (2023-06-07)大连:多措并举 保驾护航 助力滨城莘莘学子逐梦高考|焦点观察
- (2023-06-07)截至6月4日美国冬小麦抽穗率为82%
- (2023-06-07)华如科技:目前公司依托VR/AR/MR等技术 为军事模拟训练提供了多款应用产品
- (2023-06-07)精研科技:公司产品可应用于智能手机、可穿戴设备等消费电子领域 世界快报
- (2023-06-07)多只地产股面临退市,哪些基金还有持股?亏了多少?_滚动
- (2023-06-07)合力泰:公司不存在恶意拒付情形|天天通讯
- (2023-06-07)快看:雅创电子:公司的自研IC产品汽车后视镜折叠IC已实现批量出货
- (2023-06-07)全球快消息!亚联发展:目前公司未参与《深圳市加快推动人工智能高质量发展高水平应用行动方案(2023—2024年)》的相关建设
- (2023-06-07)[大行评级]国信证券:给予金山软件(03888.HK)“买入”评级 目标价37.00至39.30港元|世界今热点
- (2023-06-07)道德产生的客观条件是社会关系_道德产生的客观条件
- (2023-06-07)WhatsApp使用“故事”来缓解用户的隐私担忧 今头条
- (2023-06-07)每日消息!NBA午报|湖人不给浓眉长约 利拉德施压球队 胖虎即将当爹
- (2023-06-07)17岁丹麦王子约会意大利公主,王储妃妈妈很满意,网友也觉得般配_全球焦点
- (2023-06-07)世界速看:海关总署:前5个月民营企业进出口总额同比增长13.1%
- (2023-06-07)杰创智能:公司主营业务暂未直接涉及电子身份证领域 动态
- (2023-06-07)全球快消息!宏盛股份:公司有风力发电液冷技术、储能及动力电池液冷技术,其中储能及动力电池液冷技术正在开发中
- (2023-06-07)强化现场监督 全力护航高考
- (2023-06-07)农发行新疆分行备足138亿元资金待夏粮归仓_快资讯
- (2023-06-07)世界热头条丨第八届中国青梅节在安徽芜湖市繁昌区举行
- (2023-06-07)新疆阿瓦提县举办2023年“六五世界环境日”主题宣传活动 环球速看
- (2023-06-07)加强风险管理 推进数字化转型-天天快资讯