2025技术预测|AI研究与应用|小红书、华为仓颉的AI实践 了解详情
写点什么

业务高速增长,如祺出行如何用腾讯云消息队列 RocketMQ 应对挑战

岳小均,岁行

  • 2023-06-04
    北京
  • 本文字数:3584 字

    阅读完需:约 12 分钟

业务高速增长,如祺出行如何用腾讯云消息队列 RocketMQ 应对挑战

作者:岳小均,岁行


作为广汽集团旗下的智慧出行平台,如祺出行上线四年时间,用户规模和订单量保持高速增长。在过去的 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. 下单速度

  2. 由于整个下单的流程都已经实现了异步化,因此从询价到接单的整个流程只有 3-5 个简单的同步操作,保障了整个下单的体验。(在运力充足的前提下,大约 1.2s 就能完成接单流程)。

  3. 业务的扩展性

  4. 风控、安全、营销、派单有非常多复杂的业务逻辑,例如发券、动态折扣等,如果没有用消息队列做消息共享,就需要做 N*N 的远程调用,增加了系统复杂度,现在只需要增加一个下游订阅,就可以扩展新业务逻辑。

  5. 业务可靠性

  6. 由于业务的链条很长,因此需要做好各个环节的兜底处理,下单异步化后,可以做到关注点分离,下单主流程不会因为某个节点出现问题导致阻塞。举个例子: 在下单前,系统会异步计算好路程的近似路程公里数,假设地图服务出现延迟或者异常,就可以直接使用,保证了系统的可靠。


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 无法判断状态,等待再次发送回查。

  • 当事务执行成功,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. 大数据生态更好的对接,更好的支持实时和流计算的体验。


最终期待能够充分利用云原生带来的资源利用率的红利,以更低的成本,为客户带来全新的产品体验。


相关阅读:

专访阿里云 RocketMQ 团队:现代微服务架构需要新的消息系统


今日好文推荐:


连代码都没写就敢要融资:被ChatGPT带火的向量数据库,带来了一大波造富神话


《2023 大语言模型综合能力测评报告》出炉:以文心一言为代表的国内产品即将冲出重围


免费版“Github Copilot”,编程能力还翻倍?!谷歌硬刚微软,推出全新Colab编程平台


百度回应 Bing 成中国桌面搜索第一;阿里回应大裁员传闻;文心一言市场负责人怒怼科大讯飞|Q资讯


2023-06-04 21:328605

评论

发布
暂无评论
发现更多内容

SQL只是CRUD?

TiDB 社区干货传送门

TiDB 底层架构

TiKV 集群部署 注意事项

TiDB 社区干货传送门

PD 分配 TS 的 QPS 上限揭密

TiDB 社区干货传送门

TIDB 3.0.5 性能压测

TiDB 社区干货传送门

数据库架构选型

AskTUG 论坛迁移实战:Discourse 从 PostgreSQL 到 MySQL 到 TiDB

TiDB 社区干货传送门

移动云基于 TiDB 实现 serverless 数据库服务

TiDB 社区干货传送门

NewSQL 在微众银行核心批量场景的应用

TiDB 社区干货传送门

实践案例

日本大型移动支付软件 PayPay 的 TiDB 迁移实践

TiDB 社区干货传送门

【TiDB 4.0 新 Feature 原理及实践】 Dashboard 触手体验

TiDB 社区干货传送门

几分钟读懂 TiDB HTAP

TiDB 社区干货传送门

从内容角度看看TUG小伙伴都在关注些啥

TiDB 社区干货传送门

版本测评

某业务升级5.0解决慢SQL问题

TiDB 社区干货传送门

实践案例 故障排查/诊断

招募体验官!构建实时数仓 - 当 TiDB 遇见 Pravega

TiDB 社区干货传送门

TiDB 5.0 异步事务特性体验——基于X86和ARM混合部署架构

TiDB 社区干货传送门

从抓包发现并解决 Navicat 编辑 TiDB 视图报错的问题

TiDB 社区干货传送门

实践案例 TiDB 底层架构

【精选实践】TiDB 在马上消费金融核心账务系统归档及跑批业务下的实践

TiDB 社区干货传送门

实践案例

【TiDB 最佳实践系列】乐观锁事务

TiDB 社区干货传送门

实践案例

基于阿里云ECS部署的TiDB 2.1.14升级到4.0.0-rc实践

TiDB 社区干货传送门

管理与运维 安装 & 部署

【TiDB DevCon 2020】金融专题论坛演讲视频汇总

TiDB 社区干货传送门

tiup目录冲突检测不健全导致的节点被destroy问题以及解决

TiDB 社区干货传送门

TiDB at ZaloPay Infrastructure & Lesson Learned

TiDB 社区干货传送门

tidb开发规范

TiDB 社区干货传送门

TiDB 集群的可用性详解及 TiKV Label 规划

TiDB 社区干货传送门

TiDB 底层架构

TiCDC 应用场景解析

TiDB 社区干货传送门

实践案例

写冲突场景下的悲观/乐观事务模型选择

TiDB 社区干货传送门

实践案例

如果你的 kubelet 运行在容器中,使用 local static provisioner 要注意一个问题

TiDB 社区干货传送门

TiDB 数据库开发规范

TiDB 社区干货传送门

【热门问题】关于近期签名过期的处理合集

TiDB 社区干货传送门

Flink + TiDB,体验实时数仓之美

TiDB 社区干货传送门

实践案例

常见问题排查之 -- DM 主键冲突的原因及排查思路

TiDB 社区干货传送门

【技术专题】如何做数据库选型?

TiDB 社区干货传送门

实践案例

业务高速增长,如祺出行如何用腾讯云消息队列 RocketMQ 应对挑战_开源_InfoQ精选文章