【环球聚看点】MQ系列12:如何保证消息顺序性
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中,如何稳定地保证顺序性消息处理,是一个不可避免的话题。
(相关资料图)
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)上的数据。
标签:
相关推荐:
最新新闻:
- 世界报道:O药直击Seagen腹地:一场并不意外的意外
- 关注青少年近视防控 守护孩子明眸“视”界
- 非学科类校外培训市场价格纳入监测预警 严查价格违规行为_今日看点
- 2023年前5个月 PS5在英国的销量比去年增长了81%
- 《燕云十六声》将可单机或多人游玩 游戏可玩度极高
- 天天热议:我国新型量子计算机“悟空”即将发布:本源量子打造
- 动态焦点:质量管理系统简介
- 沙砾生物和恺佧生物达成战略合作,推进TIL疗法产业化_天天热消息
- 世界新消息丨英国游戏月销榜:《王国之泪》登顶 《霍格沃茨》第二
- 吉尔吉斯斯坦安全部门拘留30余名组织骚乱嫌疑人-当前热讯
- 司美格鲁肽概念股持续发酵;诺和诺德1.54亿欧元收购糖尿病治疗设备制造商
- 意法半导体携手三安光电,推进中国碳化硅生态系统发展
- 【环球聚看点】MQ系列12:如何保证消息顺序性
- 环球速讯:信濠光电:公司暂未涉及上述VR、MR领域
- 新闻学可以当什么(学新闻学可以干什么)
- 漫步者麦克风没声音怎么回事(麦克风没声音怎么回事)-当前焦点
- 土耳其里拉持续贬值 再创历史新低-环球快看点
- 快消息!空手道比赛级别(空手道级别)
- 社区公共文化服务有哪些(公共文化服务有哪些)_快资讯
- 全球球精选!华为联合IEEE Kazakhstan Subsection共同发布HPC无损以太和AI Fabric网络技术白皮书
- 【当前热闻】数百名非法移民冲过美墨边境大桥 墨西哥边防人员被撞倒
- 【天天快播报】美议员借军舰事件称要“坚决反对中国的欺凌”,外交部驳斥!
- Redmi新机只要600元 成618销量王|世界热议
- 放弃造车,苹果把虚拟现实放入“快车道”
- 全球即时看!铝土矿的主要成分是氧化物吗_铝土矿的主要成分
- 叶圣陶荷花原文赏析(叶圣陶荷花原文) 天天热资讯
- 小学一年级的笔画顺序表(小学一年级的笔画)
- 致闽清1302个你:旗开得胜,金榜题名!
- 中银证券首席经济学家徐高:中国居民资产负债率相当健康,不需太过担心
- 天天通讯!moto razr 40首销1万台 3999折叠屏卖疯了
- 快消息!民生加银智造2025增聘基金经理李君海 去年跌27.5%
- 怎样连接打印机设备(怎样连接打印机)
- 天天快讯:华为云张平安:华为坚定战略投入数据库 与伙伴共建繁荣开放的产业生态
- 犬人文言文翻译_犬人文言文翻译及注释 环球头条
- 上常从容与信言诸将能不文言文翻译通假字_上常从容与信言诸将能不,各有差翻译
- 光大证券收警示函 持续督导纳芯微帝科股份存4宗违规
- 汽车零部件易损件有哪些(汽车零部件易损件有哪些?)|全球观焦点
- 数智金融,长风万里鹏正举,智领睿变正当时|环球快播
- 小米14两大升级曝光 没遗憾 每日简讯
- 到“十四五”末,山东全省将培育建设工匠不少于1万名-世界聚看点
- 快报:无乃尔是过与 翻译无乃_无乃尔是过与 翻译
- 惯性定律图解(惯性定律)
- 全球观热点:系统教程篇:让windows系统自动关闭停止响应的程序
- gz 122 gov cn(gx 122 gov cn官网)|当前滚动
- 天天微速讯:喀麦隆属于哪个大洲(喀麦隆是发达国家吗)
- 中国历代皇帝顺序表电子版(清朝历代皇帝顺序简介) 世界新视野
- 一牛顿的力等于多少千克_一牛顿的力等于多少公斤
- 天天微头条丨哪两项著作被认为是荷兰创作的_哪两项著作被认为是荷马创作的
- 天天百事通!9的倍数的特征是什么_9的倍数
- 纺锤体图片(纺锤体)
- 国源科技年报遭问询 要求说明各细分业务毛利率大幅下降的原因及合理性|今日要闻
- 广信材料接待景顺长城基金等多家机构调研
- 凯撒文化:拟与深圳市幻动无极科技有限公司签订游戏开发服务合同|速读
- 光伏产能过剩未必是坏事|全球最资讯
- 天玑9300游戏性能放倒A16
- 曝一加11原神定制版手机6月推出|世界热议
- 小米13 Ultra全球版通过蓝牙SIG认证
- 今日要闻!TCL华星LTPO VR技术突破,高达1512PPI real RGB的像素密度
- 每日看点!网易易盾 AI Lab 论文入选 ICASSP 2023!黑科技让语音识别越“听”越准
- 焦点快播:省委老干部局主题教育调研组来金塔县调研
- 世茂能源06月07日主力资金大幅流出
- 微资讯!中国中等收入群体超4亿人 标准曝光:家庭年入超10万
- 重现秀发光彩的秘密 松下EH-NX71吹护机评测_今日热闻
- 全球热讯:手机模拟战争游戏推荐 在战场上做士兵
- 手机体感游戏推荐 模拟现实感觉
- 全球速递!经参数说丨16.77万亿元!细看中国外贸成绩单,这些亮点不容错过→
- 32辆电动车实测:特斯拉Model S跑最远 小鹏G9反向虚标最多
- 【全球独家】官旗促销 爱奇艺黄金会员年卡+京东plus年卡 138元
- 焦点快播:铭普光磁5涨停
- 6月7日国内萤石产业链部分价格下滑-热资讯
- 【全球速看料】6月7日国内氢氟酸产业链部分价格下滑
- 安国市场:党参持续走畅 行情继续攀升_全球看热讯
- 6月7日东北地区地炼汽柴油报价暂稳 全球热头条
- 6月7日国内现货钴价汇总_环球热点
- 2023/24年度俄罗斯小麦出口预估上调至4570万吨