写点什么

业务高速增长,如祺出行如何用腾讯云消息队列 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:328891

评论

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

一个非常好用的页面引导工具guideView,html5移动开发框架

android 程序员 移动开发

一种有效管控APP隐私权限的解决方案,Android400道面试题通关宝典助你进大厂

android 程序员 移动开发

一个8年Android 开发想转后端,还来得及嘛?,android开发菜鸟教程

android 程序员 移动开发

一封给Android开发者 UI 自动化测试上手指南,前方高能

android 程序员 移动开发

一文带你搞懂Android的-Binder-机制,flutterandroid最低版本

android 程序员 移动开发

【自学Flutter】1,详解Android架构进阶面试题

android 程序员 移动开发

【译】彻底理解 Android 中的阴影,三年经验Android开发面经总结

android 程序员 移动开发

恒源云(GpuShare)_未闻Prompt名(论文学习笔记)

恒源云

深度学习

一位Android程序员入坑Flutter后整理出一份超详细的学习笔记

android 程序员 移动开发

【译】使用Kotlin从零开始写一个现代Android-项目-Part1

android 程序员 移动开发

【译】彻底理解 Android 中的阴影(1),apk优化签名

android 程序员 移动开发

【阿里P8大牛教你Android入门之路(java篇,移动端开发工程师转型

android 程序员 移动开发

一场赛跑引起的并发知识,flutterrow换行

android 程序员 移动开发

【自学Flutter】32 交错动画的使用,掌握这个提升路径,

android 程序员 移动开发

【设计思想解读开源框架】热修复设计-,卑微打工人

android 程序员 移动开发

一位普通Android程序员呕心沥血八次大小厂的面试复盘总结,收藏一波扩展知识体系!

android 程序员 移动开发

一款简单的消息防抖框架,安卓开发权威指南

android 程序员 移动开发

【面试准备】JavaWeb部分,android webview

android 程序员 移动开发

一个view事件分发,面试官6连问直击灵魂,我被虐的体无完肤

android 程序员 移动开发

华为云·核心伙伴开发者训练营第七期开营,共赴产业云美好明天!

华为云开发者联盟

华为云 鲁班会

【面试必会】全网最具深度的三次握手,腾讯Android开发面试记录

android 程序员 移动开发

【议程公布】2021年MongoDB中文社区南京技术沙龙

MongoDB中文社区

mongodb

一个中专生的逆袭之旅(如何做到收到阿里、腾讯、滴滴等面试邀请)

android 程序员 移动开发

【最强】Android 项目集成 Flutter 实战分享,android开发笔试题

android 程序员 移动开发

【译】使用Kotlin从零开始写一个现代Android-项目-Part1(1)

android 程序员 移动开发

一文了解AndroidStudio3-4的全部更新,androidapp开发从入门到精通

android 程序员 移动开发

一种清晰, 便于扩展android项目架构方案,kotlin编程

android 程序员 移动开发

【收藏】2021年Android跳槽大厂必备宝典,阿里大牛整理

android 程序员 移动开发

一个Android开发6年程序员的年终面试总结,2021无畏艰难险阻,迎风潇洒前行

android 程序员 移动开发

【透镜系列】看穿 _ 触摸事件分发 _,android界面开发框架

android 程序员 移动开发

Cube 技术解读 | Cube 卡片技术栈详解

阿里巴巴终端技术

支付宝 客户端开发 卡片服务 cube 动态化

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