前往购买:RocketMQ
消息队列 RocketMQ 版是阿里云基于 Apache RocketMQ 构建的低延迟、高并发、高可用、高可靠的分布式消息中间件。该产品最初由阿里巴巴自研并捐赠给 Apache 基金会,服务于阿里集团 13 年,覆盖全集团所有业务。作为双十一交易核心链路的官方指定产品,支撑千万级并发、万亿级数据洪峰,历年刷新全球最大的交易消息流转记录。消息队列 RocketMQ 版既可为分布式应用系统提供异步解耦和削峰填谷的能力,同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠重试等特性。
应用场景
- 削峰填谷
诸如秒杀、抢红包、企业开门红等大型活动时皆会带来较高的流量脉冲,或因没做相应的保护而导致系统超负荷甚至崩溃,或因限制太过导致请求大量失败而影响用户体验,消息队列 RocketMQ 版可提供削峰填谷的服务来解决该问题。
- 异步解耦
交易系统作为淘宝/天猫主站最核心的系统,每笔交易订单数据的产生会引起几百个下游业务系统的关注,包括物流、购物车、积分、流计算分析等等,整体业务系统庞大而且复杂,消息队列 RocketMQ 版可实现异步通信和应用解耦,确保主站业务的连续性。
- 顺序收发
细数日常中需要保证顺序的应用场景非常多,例如证券交易过程时间优先原则,交易系统中的订单创建、支付、退款等流程,航班中的旅客登机消息处理等等。与先进先出(First In First Out,缩写 FIFO)原理类似,消息队列 RocketMQ 版提供的顺序消息即保证消息 FIFO。
- 分布式事务一致性
交易系统、支付红包等场景需要确保数据的最终一致性,大量引入消息队列 RocketMQ 版的分布式事务,既可以实现系统之间的解耦,又可以保证最终的数据一致性。
- 大数据分析
数据在“流动”中产生价值,传统数据分析大多是基于批量计算模型,而无法做到实时的数据分析,利用阿里云消息队列 RocketMQ 版与流式计算引擎相结合,可以很方便的实现将业务数据进行实时分析。
- 分布式缓存同步
天猫双 11 大促,各个分会场琳琅满目的商品需要实时感知价格变化,大量并发访问数据库导致会场页面响应时间长,集中式缓存因为带宽瓶颈限制商品变更的访问流量,通过消息队列 RocketMQ 版构建分布式缓存,实时通知商品数据的变化。
功能与特性
消息队列 RocketMQ 版在阿里云多个地域(Region)提供了高可用消息云服务。单个地域内采用多机房部署,可用性极高,即使整个机房都不可用,仍然可以为应用提供消息发布服务。

多协议接入
- HTTP 协议:采用 RESTful 风格,方便易用,快速接入,跨网络能力强。支持 Java、C++、.NET、Go、Python、Node.js 和 PHP 七种语言客户端。
- TCP 协议:区别于 HTTP 简单的接入方式,提供更为专业、可靠、稳定的 TCP 协议的 SDK 接入服务。支持的语言包括 Java、C/C++ 以及 .NET。
管理工具
- Web 控制台:支持 Topic 管理、Group 管理、消息查询、消息轨迹展示和查询、资源报表以及监控报警管理。
- OpenAPI:提供开放的 API 便于将消息队列 RocketMQ 版管理工具集成到自己的控制台。消息队列 RocketMQ 版的 API 详情请参见OpenAPI 参考。
消息类型
- 普通消息:消息队列 RocketMQ 版中无特性的消息,区别于有特性的定时和延时消息、顺序消息和事务消息。
- 事务消息:实现类似 X/Open XA 的分布事务功能,以达到事务最终一致性状态。
- 定时和延时消息:允许消息生产者对指定消息进行定时(延时)投递,最长支持 40 天。
- 顺序消息:允许消息消费者按照消息发送的顺序对消息进行消费。
特性功能
- 消息查询:消息队列 RocketMQ 版提供了三种消息查询的方式,分别是按 Message ID、Message Key 以及 Topic 查询。
- 查询消息轨迹:通过消息轨迹,能清晰定位消息从生产者发出,经由消息队列 RocketMQ 版服务端,投递给消息消费者的完整链路,方便定位排查问题。
- 集群消费和广播消费:当使用集群消费模式时,消息队列 RocketMQ 版认为任意一条消息只需要被消费者集群内的任意一个消费者处理即可;当使用广播消费模式时,消息队列 RocketMQ 版会将每条消息推送给消费者集群内所有注册过的消费者,保证消息至少被每台机器消费一次。
- 重置消费位点:根据时间或位点重置消费进度,允许用户进行消息回溯或者丢弃堆积消息。
- 死信队列:将无法正常消费的消息储存到特殊的死信队列供后续处理。
- 全球消息路由:用于全球不同地域之间的消息同步,保证地域之间的数据一致性。
- 资源报表:消息生产和消费数据的统计功能。通过该功能,您可查询在一段时间范围内发送至某 Topic 的消息总量或者 TPS(消息生产数据),也可查询在一个时间段内某 Topic 投递给某 Group ID 的消息总量或 TPS(消息消费数据)。
- 监控报警:您可使用消息队列 RocketMQ 版提供的监控报警功能,监控某 Group ID 订阅的某 Topic 的消息消费状态并接收报警短信,帮助您实时掌握消息消费状态,以便及时处理消费异常。
RocketMQ 版的高可用系统部署架构
消息队列 RocketMQ 版在任何一个环境都是可扩展的,生产者必须是一个集群,消息服务器必须是一个集群,消费者也同样。集群级别的高可用,是消息队列 RocketMQ 版跟其他的消息服务器的主要区别,消息生产者发送一条消息到消息服务器,消息服务器会随机的选择一个消费者,只要这个消费者消费成功就认为是成功了。

图中所涉及到的概念如下所述:
- Name Server:是一个几乎无状态节点,可集群部署,在消息队列 RocketMQ 版中提供命名服务,更新和发现 Broker 服务。
- Broker:消息中转角色,负责存储消息,转发消息。分为 Master Broker 和 Slave Broker,一个 Master Broker 可以对应多个 Slave Broker,但是一个 Slave Broker 只能对应一个 Master Broker。Broker 启动后需要完成一次将自己注册至 Name Server 的操作;随后每隔 30s 定期向 Name Server 上报 Topic 路由信息。
- 生产者:与 Name Server 集群中的其中一个节点(随机)建立长链接(Keep-alive),定期从 Name Server 读取 Topic 路由信息,并向提供 Topic 服务的 Master Broker 建立长链接,且定时向 Master Broker 发送心跳。
- 消费者:与 Name Server 集群中的其中一个节点(随机)建立长连接,定期从 Name Server 拉取 Topic 路由信息,并向提供 Topic 服务的 Master Broker、Slave Broker 建立长连接,且定时向 Master Broker、Slave Broker 发送心跳。Consumer 既可以从 Master Broker 订阅消息,也可以从 Slave Broker 订阅消息,订阅规则由 Broker 配置决定。
如何在业务中使用消息队列 RocketMQ
我们以一家互联网电商企业为例,其业务涉及注册、订单、库存、物流等;同时,也会涉及许多业务峰值时刻,如秒杀活动、周年庆、定期特惠等。这些活动都对分布性系统中的各项微服务应用的处理性能带来很大的挑战。
下面先以用户注册为场景说明消息队列 RocketMQ 版如何实现以下功能:
- 异步解耦
- 分布式事务的数据一致性
- 消息的顺序收发
最后,再以电商的秒杀场景和价格同步场景分别说明消息队列 RocketMQ 版所实现的削峰填谷和大规模机器的缓存同步。
异步解耦
传统处理
最常见的一个场景是用户注册后,需要发送注册邮件和短信通知,以告知用户注册成功。传统的做法有以下两种:
- 串行方式
串行方式下的注册流程如下图所示。
数据流动如下所述:
- 用户在注册页面填写账号和密码并提交注册信息,这些注册信息首先会被写入注册系统成功。
- 注册信息写入注册系统成功后,再发送请求至邮件通知系统。邮件通知系统收到请求后向用户发送邮件通知。
- 邮件通知系统接收注册系统请求后再向下游的短信通知系统发送请求。短信通知系统收到请求后向用户发送短信通知。
以上三个任务全部完成后,才返回注册结果到客户端,用户才能使用账号登录。
假设每个任务耗时分别为 50 ms,则用户需要在注册页面等待总共需要 150 ms 才能登录。
- 并行方式
并行方式下的注册流程如下图所示。
数据流动如下所述:
- 用户在注册页面填写账号和密码并提交注册信息,这些注册信息首先会被写入注册系统成功。
- 注册信息写入注册系统成功后,再同时发送请求至邮件和短信通知系统。邮件和短信通知系统收到请求后分别向用户发送邮件和短信通知。
以上三个任务全部完成后,才返回注册结果到客户端,用户才能使用账号登录。
假设每个任务耗时分别为 50 ms,其中,邮件和短信通知并行完成,则用户需要在注册页面等待总共需要 100 ms 才能登录。
以下就注册场景中使用了消息队列 RocketMQ 版的效果进行说明。
异步解耦
对于用户来说,注册功能实际只需要注册系统存储用户的账户信息后,该用户便可以登录,后续的注册短信和邮件不是即时需要关注的步骤。

数据流动如下所述:
- 用户在注册页面填写账号和密码并提交注册信息,这些注册信息首先会被写入注册系统成功。
- 注册信息写入注册系统成功后,再发送消息至消息队列 RocketMQ 版。消息队列 RocketMQ 版会马上返回响应给注册系统,注册完成。用户可立即登录。
- 下游的邮件和短信通知系统订阅消息队列 RocketMQ 版的此类注册请求消息,即可向用户发送邮件和短信通知,完成所有的注册流程。
用户只需在注册页面等待注册数据写入注册系统和消息队列 RocketMQ 版的时间,即等待 55 ms 即可登录。
异步解耦是消息队列 RocketMQ 版的主要特点,主要目的是减少请求响应时间和解耦。主要的适用场景就是将比较耗时而且不需要即时(同步)返回结果的操作作为消息放入消息队列。同时,由于使用了消息队列 RocketMQ 版,只要保证消息格式不变,消息的发送方和接收方并不需要彼此联系,也不需要受对方的影响,即解耦和。
分布式事务的数据一致性
注册系统注册的流程中,用户入口在网页注册系统,通知系统在邮件系统,两个系统之间的数据需要保持最终一致。
普通消息处理

流程说明如下:
- 注册系统发起注册。
- 注册系统向消息队列 RocketMQ 版发送注册消息成功与否的消息。
2.1 消息发送成功,进入 3。
2.2 消息发送失败,导致邮件通知系统未收到消息队列 RocketMQ 版发送的注册成功与否的消息,而无法发送邮件,最终邮件通知系统和注册系统之间的状态数据不一致。
- 邮件通知系统收到消息队列 RocketMQ 版的注册成功消息。
- 邮件通知系统发送注册成功邮件给用户。
在这样的情况下,虽然实现了系统间的解藕,上游系统不需要关心下游系统的业务处理结果;但是数据一致性不好处理,如何保证邮件通知系统状态与注册系统状态的最终一致。
事务消息处理

流程说明如下:
- 注册系统向消息队列 RocketMQ 版发送半事务消息。
1.1 半事务消息发送成功,进入 2。
1.2 半事务消息发送失败,注册系统不进行注册,流程结束。(最终注册系统与邮件通知系统数据一致)
- 注册系统开始注册。
2.1 注册成功,进入 3.1。
2.2 注册失败,进行 3.2。
- 注册系统向消息队列 RocketMQ 版发送半消息状态。
3.1 提交半事务消息,产生注册成功消息,进入 4。
3.2 回滚半事务消息,未产生注册成功消息,流程结束。(最终注册系统与邮件通知系统数据一致)
- 邮件通知系统接收消息队列 RocketMQ 版的注册成功消息。
- 邮件通知系统发送注册成功邮件。(最终注册系统与邮件通知系统数据一致)
消息的顺序收发
消息队列 RocketMQ 版顺序消息分为两种情况:
- 全局顺序:对于指定的一个 Topic,所有消息将按照严格的先入先出(FIFO)的顺序,进行顺序发布和顺序消费;
- 分区顺序:对于指定的一个 Topic,所有消息根据 Sharding Key 进行区块分区,同一个分区内的消息将按照严格的 FIFO 的顺序,进行顺发布和顺序消费,可以保证一个消息被一个进程消费。
在注册场景中,可使用用户 ID 作为 Sharding Key 来进行分区,同一个分区下的新建、更新或删除注册信息的消息必须按照 FIFO 的顺序发布和消费。
削峰填谷
流量削峰也是消息队列 RocketMQ 版的常用场景,一般在秒杀或团队抢购活动中使用广泛。

秒杀处理流程如下所述:
- 用户发起海量秒杀请求到秒杀业务处理系统。
- 秒杀处理系统按照秒杀处理逻辑将满足秒杀条件的请求发送至消息队列 RocketMQ 版。
- 下游的通知系统订阅消息队列 RocketMQ 版的秒杀相关消息,再将秒杀成功的消息发送到相应用户。
- 用户收到秒杀成功的通知。
大规模机器的缓存同步
双十一大促时,各个分会场会有玲琅满目的商品,每件商品的价格都会实时变化。使用缓存技术也无法满足对商品价格的访问需求,缓存服务器网卡满载。访问较多次商品价格查询影响会场页面的打开速度。
此时需要提供一种广播机制,一条消息本来只可以被集群的一台机器消费,如果使用消息队列 RocketMQ 版的广播消费模式,那么这条消息会被所有节点消费一次,相当于把价格信息同步到需要的每台机器上,取代缓存的作用。