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:如何保证消息可靠性传输
(资料图片)
消息的有序性在很多业务场景中占有很重要的位置。比如购物场景,需要按照 创建订单 --> 订单付款 --> 完成订单 顺序执行。又比如出行场景,接单 --> 接送到达目的地 --> 付款 --> 完成订单。这种是严格按照顺序执行的,这样的顺序消费才不会出问题,而且各个订单之间是互相独立和并行执行的。所以,在MQ中,如何稳定地保证顺序性消息处理,是一个不可避免的话题。
2 消息的有序性说明消息的有序执行,一般不是单个组件的能力。而是整个消息从生产,排队,存储到消费都是有序的,比如上面提到的购物和出行场景。这就要求我们在消息队列(如果是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)上的数据。
关键词:
世界快看:MQ系列12:如何保证消息顺序性 [MQ系列1:消息中间件执行原理](https: www cnblogs com wzh2010 p 15
股票不能当天买入当天卖出吗 为什么中国的股票交易不能当天买当天卖呢世界都这样吗?为什么中国的股
11位“兰亭奖”书法家齐聚申城 “风华正茂”的青年人用文字创新 热点 东方网记者熊芳雨6月7日报道:“兰亭奖”是中国书坛最高荣誉,当11位入
环球滚动:强制猥亵侮辱罪会判多少年 影响刑事量刑的因素较多,如刑事责任年龄、主从犯、自首、坦白、累犯、
【报资讯】东方电气国内单机容量最大冲击式水电机组完成国产化改造 6月7日,国内单机容量最大的冲击式水电机组完成国产化改造,成功并网发
江西:118家法院少年法庭全覆盖 近日,记者从江西省高级人民法院获悉,近年来,江西法院坚持未成年人权
世界快看:MQ系列12:如何保证消息顺序性 [MQ系列1:消息中间件执行原理](https: www cnblogs com wzh2010 p 15
世界动态:沙砾生物和恺佧生物达成战略合作,推进TIL疗法产业化 近日,苏州沙砾生物科技有限公司和恺佧生物科技(上海)有限公司就重组
申购费率什么意思_什么是基金申购费率 申购费率什么意思申购费率就是投资者在基金成立后购买基金份额时,需要
股票不能当天买入当天卖出吗 为什么中国的股票交易不能当天买当天卖呢世界都这样吗?为什么中国的股
全球报道:悦达起亚入选“私家车新车上牌免查验试点企业” 近日,买车网Buycar获悉,公安部宣布继续扩大私家车新车上牌免查验试点
世界快资讯:经济观察:中国5G商用四周年,交出怎样的成绩单? 经济观察:中国5G商用四周年,交出怎样的成绩单?,
11位“兰亭奖”书法家齐聚申城 “风华正茂”的青年人用文字创新 热点 东方网记者熊芳雨6月7日报道:“兰亭奖”是中国书坛最高荣誉,当11位入
卡霍夫卡水电站大坝遭破坏,会有哪些影响? 卡霍夫卡水电站位于俄罗斯控制的扎波罗热核电站下游,该核电站依靠卡霍
天天快看:甲方签的租赁合同是否有效 违反法律法规的合同是无效的。有下列情形之一的,可认定合同或者部分合
环球滚动:强制猥亵侮辱罪会判多少年 影响刑事量刑的因素较多,如刑事责任年龄、主从犯、自首、坦白、累犯、
当前消息!试用期被辞退有工资补偿吗? 在劳动法中,经济补偿金是用人单位解除劳动合同时,给予劳动者的经济补
世界报道:第二十三届中国国际石油石化技术装备展览在京开幕 5月31日,一年一度的世界石油天然气大会——第二十三届中国国际石油石
【报资讯】东方电气国内单机容量最大冲击式水电机组完成国产化改造 6月7日,国内单机容量最大的冲击式水电机组完成国产化改造,成功并网发
天天观点:23旭越惠诚2优先B票面利率为2.6200% 23旭越惠诚2优先B票面利率为2 6200%
中国刀削面飘香巴黎集市 “一刀锅落一刀飘,一叶离面又出刀。”法国巴黎的集市上,中国北方传统
江西:118家法院少年法庭全覆盖 近日,记者从江西省高级人民法院获悉,近年来,江西法院坚持未成年人权
618哪款千元机值得买?4年流畅不卡顿,OPPO K11x配置均衡价格实惠 随着高考季的到来,准大学生们不仅迎来了暑假,也意味着即将进入新的学
以税为“笔”绘就乡村振兴美好新蓝图-今日快讯 为实现税费政策助力乡村振兴,让税费政策走进基层,推动乡村特色产业
新时代“新农人” 绘出乡村美好蓝图 走进四川省泸州市纳溪区丰乐镇保安村猕匠农业科技有限公司的猕猴桃种植
把好“四关”防风险 6月5日,国网福建将乐县供电公司纪检工作人员在开展配网建设专项监督中
赴考满分!送考满分!高考首日,好的故事开头|短讯 赴考满分!送考满分!高考首日,好的故事开头!
焦点快播:再添两宗!白云区两宗成片连片加装电梯方案公布 近日,白云区汇雅花园小区和心谊路公安宿舍成片连片加装电梯方案在广州
和胜股份:在项目研发前沿领域一直与宁德时代深度合作 和胜股份表示,公司在项目研发前沿领域一直与宁德时代保持深度合作。由
23安徽债57今日发布发行公告 23安徽债57发布发行公告
加税立竿见影 新加坡5月外国人购房量暴跌50%-环球微速讯 第一太平戴维斯对新加坡市区重建局数据的分析显示,在4月底大幅提高对
澳优出售新西兰奶粉工厂 买方为伊利全资子公司_全球快播 业绩下滑,澳优乳业开始清理旗下亏损的海外奶粉合资公司。6月6日晚间,
lol炫彩皮肤怎么使用_谁知道炫彩皮肤怎么用 1、昨日英雄联盟正式上线全新炫彩皮肤,很多玩家还不知道lol炫彩皮肤包
环球微头条丨我真是大明星有没有后续_我真是大明星为什么不更新了 1、好像是触碰红线了很正常 不想更新了呗作者更不了坚持初衷,爱我所
尿蛋白2个加号是怎么回事_尿蛋白1个加号严重吗|环球新资讯 1、尿蛋白一加征一般不严重,蛋白尿一加征有功能性蛋白尿和病理性蛋白
丹东海关在进境邮件中查获金龟科幼虫|最资讯 人民网北京6月7日电(记者王震)据海关总署办公厅官方微博@海关发布消
快看:科大讯飞:AI学习机销售迎来“618”开门红 同比提升247% 科大讯飞6月7日披露投资者关系活动...
世界实时:宏华数科:南港工业区宏华数码喷印墨水一体化基地项目预计2023年开工 2... 宏华数科6月7日在互动平台回答投资...
天奇股份:磷酸铁锂电池环保项目全线贯通 锂电回收行业工艺技术迈向新台阶 据天奇股份官微消息,近日,天奇股...
注意!家家悦将于6月26日召开股东大会|环球快讯 家家悦(SH603708,收盘价:13 18...
怎样保存大米一年不坏?真空大米放了3—4年还能吃么? 怎样保存大米一年不坏?1、用锅煮花...
最新消息:河北省40幅摄影作品参加第三十四届华北摄影艺术展览 近日,第三十四届中国华北摄影艺术...
获奖名单公布!第十三届中国艺术节在河北雄安新区落下帷幕 9月15日晚,第十三届中国艺术节在...
2022北京时装周9月15日至22日将在线上线下举办多场活动 一年一度的北京时装盛典即将拉开帷...