导语
作为广汽团体旗下的智慧出行平台,如祺出行上线四年工夫,用户规模和订单量保持高速增长。在过来的 2022 年,如祺出行平台累计注册用户冲破 1800 万,同比增长 64%,年度订单总量超 7000 万,同比增长 52%。
高速增长的用户规模和订单量,对技术平台提出更高要求。
随着专慢车业务的快速增长,越来越多业务需要与业务主流程耦合,导致调用链过长,接口提早减少了数倍,整体架构无论是性能还是扩展性,都存在很大的危险,遇到节假日顶峰,随时都有解体的危险。
为了晋升架构的稳定性,保障用户体验,如祺出行于 2021 年启动架构降级。其中,引入音讯队列做异步化是整个分布式架构设计的外围伎俩之一。
音讯队列是一种异步通信机制,能够将音讯从发送方发送到接管方,而不须要立刻解决。这种机制能够带来以下益处:
1. 异步化解决:音讯队列能够将不同组件或服务之间的通信异步化,使得用户下单速度更快,体验更好,进步零碎的响应速度和吞吐量。
2. 冗余解决:音讯队列能够将音讯复制到多个正本中,确保即便某个节点呈现故障,音讯也不会失落。
3. 解耦合:音讯队列能够将不同组件或业务之间的通信解耦合,每个业务只须要关注本人订阅的音讯,从而将下单主流程跟其它业务流程解耦,保障了主流程的稳固和晋升了运维的可观测性。
4. 流量管制:音讯队列能够对音讯进行缓冲和限流,避免音讯发送方发送过多的申请导致接管方解决不过去,从而进步零碎的稳定性。
音讯队列选型
2019 年以来,如祺出行次要采纳 CMQ 作为订单主业务的音讯队列,CMQ 是一种大规模分布式音讯零碎,它具备高可用性、高吞吐量、海量存储和高并发能力等特点,能够帮忙用户在分布式系统中进行异步通信,进步应用程序的可用性和可扩展性,但因为 CMQ 协定和性能简略,不反对事务音讯,程序音讯和大规模提早音讯等局限性,研发团队决定采纳 RocketMQ 作为降级计划,满足日益简单的订单业务场景。
RocketMQ 介绍
Apache RocketMQ 是一个开源的分布式消息中间件,因其架构简略、业务功能丰富、具备极强可扩展性等特点被泛滥企业开发者以及云厂商采纳,它具备高性能、高可用性、高可靠性和易于应用等劣势,尤其在互联网、大数据、企业应用、金融交易等在线业务场景成为开发者首选的音讯队列产品。
RocketMQ 能够帮忙业务实现异步通信、流量削峰、数据同步和日志解决等利用场景,还提供了丰盛的高级个性,比方事务音讯、定时音讯、重试音讯和死信音讯等特色性能,腾讯云针对 RocketMQ 做了大量的优化加强,在齐全兼容社区版的根底上,提供了秒级定时音讯、命名空间,音讯轨迹和丰盛的监控告警指标等企业级个性,能够很好地满足如祺订单零碎等各种简单的音讯解决需要。
如祺打车业务流程介绍
在整个下单流程中,从预估到下单,再从派单到开始服务,最初到费用结算,一共要通过 20+ 流程环节,其中计费订单零碎是所有零碎的外围,从用户输出上下车地点,背地的业务零碎就开始工作,比方营销零碎查问用户折扣和优惠、地图零碎开始做门路布局、安全监控零碎做分控计算、预派单零碎提前做派单剖析等,业务零碎须要实现大量的计算工作,对数据的实时性、准确性和一致性要求十分高,并且波及大量的零碎交互,这对整个零碎的稳定性要求提出很大的挑战。
通过 RocketMQ 做异步化革新
在没有通过 RocketMQ 解决之前,各个系统之间的耦合度十分高,零碎稳定性危险高,引入 RocketMQ 实现了下单异步化革新,大量工作异步通信解决,大大晋升了订单业务零碎的可扩展性和可靠性,其次要体现在以下几个方面:
1. 下单速度
因为整个下单的流程都曾经实现了异步化,因而从询价到接单的整个流程只有 3 - 5 个简略的同步操作,保障了整个下单的体验。(在运力短缺的前提下,大概 1.2s 就能实现接单流程)。
2. 业务的扩展性
风控、平安、营销、派单有十分多简单的业务逻辑,例如发券、动静折扣等,如果没有用音讯队列做音讯共享,就须要做 N *N 的近程调用,减少了零碎复杂度,当初只须要减少一个上游订阅,就能够扩大新业务逻辑。
3. 业务可靠性
因为业务的链条很长,因而须要做好各个环节的兜底解决,下单异步化后,能够做到关注点拆散,下单主流程不会因为某个节点呈现问题导致阻塞。举个例子: 在下单前,零碎会异步计算好途程的近似途程公里数,假如地图服务呈现提早或者异样,就能够间接应用,保障了零碎的牢靠。
RocketMQ 在订单零碎的利用
定时音讯场景
定时音讯是指音讯发送方将音讯发送到 RocketMQ 时,音讯不是立刻能够被上游订阅者生产,而是指定音讯在未来一段时间才能够被生产。
RocketMQ 开源社区版 (4.x 版本) 没有反对秒级精度的定时音讯计划,只能指定几个固定的提早级别,腾讯云在社区版的根底上,通过基于工夫轮的调度引擎,先将定时音讯暂存在外部定时音讯队列,再通过调度引擎按指定的定时工夫,将音讯调度到一般音讯队列,上游生产刚才能够失常生产音讯,默认最长能够反对 40 天的定时范畴(如果购买了专业版的客户,能够通过工单申请更长的定时范畴)。
在打车业务中,有大量的定时音讯场景,比方订单实现超过肯定工夫后其状态主动流转,订单超过肯定工夫未接单主动揭示等业务场景,在未接入 RocketMQ 之前,要依赖轮询数据库来实现,对数据库压力十分大,接入 RocketMQ 后,不仅大大缓解了数据库压力,零碎的依赖关系也大量简化。
事务音讯场景
事务音讯是 Apache RocketMQ 提供的一种高级音讯类型,反对在分布式场景下保障音讯生产和本地事务的最终一致性,尤其是在对数据一致性要求高的交易场景有宽泛的利用,次要外围过程如下。
1. 生产者发送音讯到 RocketMQ 中。
2. 服务端收到音讯后将音讯存储到半音讯 Topic 中。
3. 当本地事务执行实现。
4. 生产者被动将事务执行后果发送到 RocketMQ 中。
5. 若本地事务执行后果超过肯定期限还没反馈,RocketMQ 将执行回查逻辑。
6. 生产者收到音讯回查后,须要查看对应音讯的本地事务执行的最终后果,并反馈事务状态,有以下三种状况:
● TransactionStatus.COMMIT 提交事务,消费者能够生产到该音讯。
● TransactionStatus.ROLLBACK 回滚事务,音讯被抛弃,消费者不会生产到该音讯。
● TransactionStatus.UNKNOW 无奈判断状态,期待再次发送回查。
7. 当事务执行胜利,RocketMQ 将事务音讯提交到 real topic,待消费者生产。
打车业务中,有多个业务零碎波及交易数据的一致性,通过事务音讯和本地数据库事务联合,确保了零碎之间数据的一致性,并且简化了业务开发的复杂度。
程序音讯场景
程序音讯能够保障同一分区程序 key 的音讯的生产程序和发送程序统一,罕用于订单交易,金融,电商等业务场景,将同一用户或订单的不同音讯依照时序进行解决,防止解决音讯乱序带来的弥补操作等复杂度。
在如祺订单零碎中,上游将订单 ID 作为 ShardKey,同一个订单的零碎都会被发送到同一个分区中,上游零碎订阅音讯时,就能够针对同一个订单的音讯按程序解决,防止解决订单音讯乱序的复杂度,并且不便做本地缓存策略,晋升零碎的整体性能。
RocketMQ 上云的收益
绝对于开源自建的 RocketMQ 解决方案,腾讯云提供了齐全兼容社区版 RocketMQ SDK 的能力,还提供了元数据导入工具,并且反对多 Namespace 在集群内做逻辑隔离,客户只须要改一行接入点信息就实现迁徙工作。
除了不便客户从社区版做代码迁徙外,腾讯云 RocketMQ 还提供了大量运维能力,反对多集群部署管控和动静扩缩容,开箱即用的监控大盘和指标告警能力,还反对音讯轨迹、生产状态、异样诊断等多样的监控定位伎俩,和音讯回溯、生产验证、测试音讯、死信重发等便捷的性能,不便问题定位和日常保护。
将来瞻望
以后 RocketMQ 曾经齐全兼容社区版本 4.x 系列版本,并且曾经反对虚构集群和专享集群等产品状态,满足用户的不同应用场景。
2022 年 9 月,RocketMQ 社区曾经公布了 5.x 版本,RocketMQ 5.x 引入了全新的弹性无状态代理模式,基于 gRPC 协定提供了新的更简洁易用的 SDK,并将以后的 Broker 职责进行拆分,对于客户端协定适配、权限治理、生产治理等计算逻辑进行抽离,独立无状态的代理角色提供服务,Broker 则持续专一于存储能力的继续优化。
2023 年 6 月,腾讯云将基于社区 RocketMQ 5.x 版本推出新的 Serverless 产品状态,在以下几个方面继续发力:
1. 弹性计算和分层存储带来更低的应用老本。
2. 新的 SDK 带来更好的开发体验和多语言生态反对。
3. 大数据生态更好的对接,更好的反对实时和流计算的体验。
最终期待可能充分利用云原生带来的资源利用率的红利,以更低的老本,为客户带来全新的产品体验。