原副标题:Apache RocketMQ 5.0 最新消息高阶:怎样支撑力繁杂的销售业务最新消息情景?
连续性
具体而言上看 RocketMQ 的第二个优点-外交事务最新消息,外交事务最新消息是 RocketMQ 与连续性有关的优点,也是 RocketMQ 不同于其他最新消息堆栈的最具发展性的优点。
以小规模B2C控制系统为例,退款获得成功前会在证券交易中订货资料库将订货状况预览为已退款。然后证券交易再推送两条最新消息给 RocketMQ,RocketMQ 将订货已退款的该事件通告给所有上游应用领域,确保先期的按期各个环节。
但前述业务流程存在两个问题,证券交易写资料库与发最新消息相互合二为一,它不是两个外交事务,会出现多种不同极度现象,比如说资料库写获得成功但最新消息发失利,这个订货的状况下游应用领域转交不出,对于B2C销售业务而言,可能导致大批使用者退款但商家不提货的情况;而假如三垒手最新消息获得成功再写资料库失利,会导致上游应用领域认为订货已退款,大力推进商家提货,但是前述使用者未退款获得成功。这些极度单厢对B2C销售业务造成大批脏数据,产生毁灭性销售业务不良后果。
而 RocketMQ 外交事务最新消息的潜能可以确保商品和服务的邻近地区外交事务(如写资料库)、发最新消息外交事务的连续性,最后透过 Broker at least once 的消费需求语法,确保消费者的邻近地区外交事务也能继续执行获得成功,最后同时实现商品和服务、顾客对同两个销售业务的外交事务状况达到最后完全一致。
连续性:外交事务最新消息-基本原理
如下表所示图右图,外交事务最新消息主要透过两期递交+外交事务补偿金监督机制紧密结合同时实现。
具体而言商品和服务会推送 half 最新消息,也就是 prepare 最新消息,broker 会把 half 存入堆栈中。接下去商品和服务继续执行邻近地区外交事务,一般是写资料库,邻近地区外交事务顺利完成后,会往 RocketMQ 推送 commit 操作方式,RocketMQ 会把 commit 操作方式载入 OP 堆栈,并进行 compact,把已递交的最新消息写到 ConsumeQueue 对顾客由此可见。如此一来假如是 rollback 操作方式,则会埃唐佩县有关联的 half 最新消息。
直面极度的情况,比如说商品和服务在推送 commit 或者 rollback 之前宕机了,RocketMQ broker 还会有补偿金检查监督机制,定期回查 Producer 的外交事务状况,继续大力推进外交事务。
无论是 Prepare 最新消息、还是 Commit/Rollback 最新消息、或者是 compact 各个环节,在存储层面都是遵守 RocketMQ 以顺序读写为主的设计理念,达到最优吞吐量。
连续性:外交事务最新消息 demo
接下来上看两个外交事务最新消息的简单示例。使用外交事务最新消息需要同时实现两个外交事务状况的查询器,这也是和普通最新消息两个最大的区别。假如我们是两个证券交易,这个外交事务回查器的同时实现可能就是根据订货 ID 去查询资料库来确定这个订货的状况到底是否是递交,比如说说创建获得成功、已退款、已退款等。主体的最新消息生产业务流程也有很多不同,需要开启分布式外交事务,进行两期递交,三垒手两个 prepare 的最新消息,然后再去继续执行邻近地区外交事务。这里的邻近地区外交事务一般就是继续执行资料库操作方式。然后假如邻近地区外交事务继续执行获得成功的话,就整体 commit,把之前的 prepare 的最新消息递交掉。这样一来顾客就可以消费需求这条最新消息的。假如邻近地区外交事务出现极度的话,那么就把整个外交事务 rollback 掉,之前的那条 prepare 的最新消息也会被取消掉,整个过程就回滚了。外交事务最新消息的用法变化主要体现在商品和服务代码,顾客使用方式和普通最新消息完全一致,demo 里面就不展示了。
连续性:顺序最新消息情景+基本原理
RocketMQ 的第二个高级优点是顺序最新消息,也是特色潜能之一。它解决了顺序连续性的问题,确保同两个销售业务的最新消息,生产与消费需求的顺序保持完全一致。
阿里曾有两个情景是买商家资料库复制,由于阿里订货资料库采用分库分表技术,面向买商家不同的销售业务情景,会分别按照买家主键与商家主键拆分为买商家资料库。两个资料库的同步采用 Binlog 顺序分发的监督机制,透过使用顺序最新消息,将买家库的 Binlog 变更按照严格顺序在商家库回放,以此达到订货资料库的连续性。假如没有顺序确保,则可能出现资料库级别的脏数据,会带来严重的销售业务错误。
顺序最新消息的同时实现基本原理如下表所示图右图,充分利用 Log 天然顺序读写的特点高效同时实现。
在 Broker 存储模型中,每个 Topic 单厢有固定的 ConsumeQueue,可以理解为 Topic 的分区。商品和服务为推送最新消息加上销售业务 Key,在这个 case 里面可以用订货 ID,同两个订货 ID 的最新消息会顺序推送到同两个个 Topic 分区,每个分区在某个时刻只会被两个顾客锁定,顾客顺序读取同两个个分区的最新消息串行消费需求,以此来达到顺序连续性。
连续性:顺序最新消息 demo
接下去上看顺序最新消息的两个简单 demo。对于顺序最新消息而言,商品和服务与顾客都有需要注意的地方。
在生产期,具体而言要定义最新消息的 group。每条最新消息都可以选择销售业务 ID 作为最新消息 Group,销售业务 ID 尽量离散、随机。因为同两个销售业务 ID 会分配到同两个数据存储分片,生产与消费需求都在该数据分片上串行,假如销售业务 ID 有热点,会导致严重的数据倾斜与局部最新消息堆积。
比如说在B2C交易的情景,选择订货 ID、买家 ID 会比较好,比较离散。假如选择的是商家 ID,则可能会出现热点,热点商家的流量会远大于普通商家。
nsumer 模式。RocketMQ SDK 会确保同两个分组的最新消息串行进入销售业务消费需求逻辑。需要注意,自身的销售业务消费需求代码也要串行进行,然后同步返回消费需求获得成功确认。不要将同两个分组的最新消息放到另外的线程池消并发费,会破坏顺序语法。
繁杂销售业务
繁杂销售业务:SQL 过滤情景
RocketMQ 的第三个高级优点是 SQL 消费需求模式,也是繁杂销售业务情景的刚需。
如上图,阿里的B2C销售业务围绕着交易展开,有数百个不同的销售业务在订阅交易消息。销售业务基本面向某个细分领域,都只需要交易 Topic 下的部分最新消息。按照传统的模式,一般是全量订阅交易 Topic,在顾客邻近地区过滤即可,但这样会消耗大批计算、网络资源,特别是在双十一,该方案的成本是无法接受的。
繁杂销售业务:SQL过滤基本原理
为了解决前述问题,RocketMQ 提供了 SQL 消费需求模式。在交易情景下,每笔订货最新消息单厢带有不同维度的销售业务属性,包括商家 ID、买家 ID、类目、省市、价格、rcreate and(Price between 50 and 100),Broker 会在服务端运行 SQL 计算,只返回有效数据给顾客。
为了提高性能,Broker 还引入了布隆过滤器模块。在消息载入分发时刻提前计算结果,载入位图过滤器,减少无效 IO。
总体而言,其本质为将过滤链路不断前置,从消费需求端邻近地区过滤,到服务端写时过滤,达到最优性能。
繁杂销售业务:SQL 过滤 demo
接下去看两个 SQL 订阅的示例。目前 RocketMQ SQL 过滤支持属性非空判断、属性大小比较、属性区间过滤、集合判断与逻辑计算,能满足绝大部分的过滤需求。
在最新消息生产期,除了设置 Topic、Tag 之外,还能添加多个自定义属性。比如说在这案例里,设置了两个 region 的属性,表示该条最新消息从杭州 region 发出。消费需求时可根据自定义属性来进行 SQL 过滤订阅。第二个 case 是用了两个 filter expression,判断 region 这个字段不为空且等于杭州才消费需求。第二个 case 添加更多的条件,假如这是一笔订货最新消息,还可以同时判断 region 条件和价格区间来决定是否消费需求。第三个 case 是全转交模式,表达式直接为 True,这个订阅方式会转交某两个主题下面的全量最新消息,不进行任何过滤。
繁杂销售业务:定时最新消息情景+基本原理
RocketMQ 的第四个高级优点是定时最新消息。
商品和服务可以指定某条消息在推送后经过一定时间后才对顾客由此可见。有不少销售业务情景需要小规模的定时该事件触发,比如说典型的B2C情景基本都有订货创建 30 分钟未退款自动关闭订货的逻辑,定时最新消息能为前述情景带来极大的便利性。
RocketMQ 的定时最新消息基于时间轮(TimerWheel)来同时实现。透过模拟表盘转动来达到对时间进行排序的目的。
TimerWheel 中的每一格代表最小的时间刻度,称为 Tick。RocketMQ 里,每两个 Tick 为一秒,同两个时刻的最新消息会载入到同两个格子里。由于每个时刻可能会同时触发多条最新消息,并且每条最新消息的载入时刻都不一样,因此 RocketMQ 也同时引入了 Timerlog 的数据结构,Timerlog 按照顺序 append 的方式载入数据,每个元素都包含最新消息的物理索引以及指向同两个时刻的前两条最新消息,组成逻辑链表。TimeWheel 的每个格子都维护该时刻的最新消息链表的头尾指针。
TimerWheel 会有指针,代表当前时刻,绕着 TimerWheel 循环转动,指针所指之处代表该 Tick 到期,所有内容一起弹出,写到 ConsumeQueue,对顾客由此可见。
目前 RocketMQ 的定时消息性能已经远超 RabbitMQ 与 ActiveMQ。
全局高可用
接下去再讲一下 RocketMQ 的全局高可用技术解决方案。RocketMQ 的高可用架构主要指 RocketMQ 集群内的数据多副本与服务高可用。而本文的高可用是全局的、业界常说的同城容灾、两地三中心、异地多活等架构。
目前,蚂蚁支付与阿里交易均采用异地多活的架构,异地多活相对于冷备、同城容灾、两地三中心模式具备更多优点,可以应对城市级别的灾难,如地震、断电等该事件。除此之外,针对一些因为人为操作方式引起的问题,比如说某个基础控制系统变更引入新的 bug,导致整个机房级别的不可用,异地多活架构可以直接将流量切到可用机房,优先确保销售业务连续性,再定位具体的问题。
另一方面,异地多活还能同时实现机房级别的扩容,单一机房的计算存储资源有限,而异地多活架构可以将销售业务流量按照比例分散在全国各地机房。同时,多活架构同时实现了所有机房都提供销售业务服务,而不是冷备状态,资源利用率大幅度提升。得益于多活状况,直面极端情景的切流,可用性更有确保,信心更足。
在异地多活的架构中,RocketMQ 承担的是基础架构的多活潜能。多活的架构分为几个模块:
接入层:透过统一接入层按照销售业务 ID 将使用者请求分散到多个机房,销售业务 ID 一般可采用使用者 ID。应用领域层:应用领域层一般无状况,当请求进入某个机房后,需要尽量确保该请求的整个链路都在单元内封闭,包括 RPC、资料库访问、最新消息读写,可降低访问延迟,确保控制系统性能不会因为多活架构衰退。数据层:包括资料库、最新消息堆栈等有状况控制系统。RocketMQ 透过 connector 组件同时实现按 topic 粒度实时同步最新消息的数据,按照 Consumer 与 Topic 的组合粒度实时同步消费需求状况。全局的管控层:需要维护全局的单元化规则,分配哪些流量走到哪些机房;还需要管理多活元数据配置,哪些应用领域需要多活、哪些 Topic 需要多活;另外,在切流时刻需要协调所有控制系统的切流过程,控制切流顺序。总结
本篇文章介绍了很多 RocketMQ 的高阶优点。具体而言是连续性的优点,这里面就包括了顺序的连续性、分布式销售业务的连续性;RocketMQ 在应对大规模繁杂销售业务的优点有 2 个,两个是 SQL 过滤订阅,可以应对那种单一超大销售业务大批顾客过滤需求;还有两个是定时最新消息,这也是很多互联网交易销售业务常见的情景。最后,介绍了 RMQ 在高阶的容灾潜能方面的建设,提供了两个异地多活的解决方案。
作者:隆基
点击立即免费试用云产品:https://click.aliyun.com/m/1000373503/原文链接:https://click.aliyun.com/m/1000379362/
本文为阿里云原创内容,未经允许不得转载。