RocketMQ:什么是消息队列 MQ?

消息队列 MQ 既可为分布式应用系统提供异步解耦和削峰填谷的能力,同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠重试等特性。

核心概念

  • Topic:消息主题,一级消息类型,生产者向其发送消息。
  • 生产者:也称为消息发布者,负责生产并发送消息至 Topic。
  • 消费者:也称为消息订阅者,负责从 Topic 接收并消费消息。
  • 消息:生产者向 Topic 发送并最终传送给消费者的数据和(可选)属性的组合。
  • 消息属性:生产者可以为消息定义的属性,包含 Message Key 和 Tag。
  • Group:一类生产者或消费者,这类生产者或消费者通常生产或消费同一类消息,且消息发布或订阅的逻辑一致。

消息收发模型

消息队列 MQ 支持发布/订阅模型,消息生产者应用创建 Topic 并将消息发送到 Topic。消费者应用创建对 Topic 的订阅以便从其接收消息。通信可以是一对多(扇出)、多对一(扇入)和多对多。

具体通信如下图所示。
RocketMQ:什么是消息队列 MQ?

  • 生产者集群: 用来表示发送消息应用,一个生产者集群下包含多个生产者实例,可以是多台机器,也可以是一台机器的多个进程,或者一个进程的多个生产者对象。

一个生产者集群可以发送多个 Topic 消息。发送分布式事务消息时,如果生产者中途意外宕机,Broker 会主动回调生产者集群的任意一台机器来确认事务状态。

  • 消费者集群:用来表示消费消息应用,一个消费者集群下包含多个消费者实例,可以是多台机器,也可以是多个进程,或者是一个进程的多个消费者对象。

一个消费者集群下的多个消费者以均摊方式消费消息。如果设置的是广播方式,那么这个消费者集群下的每个实例都消费全量数据。

一个消费者集群对应一个 Group ID,一个 Group ID 可以订阅多个 Topic,如图中的 Group 2 所示。Group 和 Topic 的订阅关系可以通过直接在程序中设置即可.

消息队列 MQ 提供 TCP、HTTP 和 STOMP 协议的多语言接入方式,方便不同编程语言开发的应用快速接入消息队列 MQ 消息云服务。您可以将应用部署在阿里云 ECS、企业自建云,或者嵌入到移动端、物联网设备中与消息队列 MQ 建立连接进行消息收发;同时,本地开发者也可以通过公网接入消息队列 MQ 服务进行消息收发。

功能概览图
RocketMQ:什么是消息队列 MQ?

多协议接入

  • HTTP 协议:采用 RESTful 风格,方便易用,快速接入,跨网络能力强。支持 Java、C++、.NET、Go、Python、Node.js 和 PHP 七种语言客户端。
  • TCP 协议:区别于 HTTP 简单的接入方式,提供更为专业、可靠、稳定的 TCP 协议的 SDK 接入服务。支持的语言包括 Java、C/C++ 以及 .NET。
  • STOMP 协议:类似于 HTTP 的纯文本的协议机制,常用于脚本语言(如 Ruby、Python、Perl)和消息队列 MQ Broker 进行轻量级交互。

管理工具

  • Web 控制台:支持 Topic 管理、Group 管理、消息查询、消息轨迹展示和查询、资源报表以及监控报警管理。
  • OpenAPI:提供开放的 API 便于将消息队列 MQ 管理工具集成到自己的控制台。

消息类型

  • 普通消息:消息队列 MQ 中无特性的消息,区别于有特性的定时/延时消息、顺序消息和事务消息。
  • 事务消息:实现类似 X/Open XA 的分布事务功能,以达到事务最终一致性状态。
  • 定时/延时消息:允许消息生产者对指定消息进行定时(延时)投递,最长支持 40 天。
  • 顺序消息:允许消息消费者按照消息发送的顺序对消息进行消费。

特色功能

  • 消息查询:消息队列 MQ 提供了三种消息查询的方式,分别是按 Message ID、Message Key 以及 Topic 查询。
  • 消息轨迹:通过消息轨迹,能清晰定位消息从生产者发出,经由消息队列 MQ 服务端,投递给消息消费者的完整链路,方便定位排查问题。
  • 集群消费和广播消费:当使用集群消费模式时,消息队列 MQ 认为任意一条消息只需要被消费者集群内的任意一个消费者处理即可;当使用广播消费模式时,消息队列 MQ 会将每条消息推送给消费者集群内所有注册过的消费者,保证消息至少被每台机器消费一次。
  • 重置消费位点:根据时间或位点重置消费进度,允许用户进行消息回溯或者丢弃堆积消息。
  • 死信队列:将无法正常消费的消息储存到特殊的死信队列供后续处理。
  • 全球消息路由:用于全球不同地域之间的消息同步,保证地域之间的数据一致性。
  • 资源报表:消息生产和消费数据的统计功能。通过该功能,您可查询在一段时间范围内发送至某 Topic 的消息总量或者 TPS(消息生产数据),也可查询在一个时间段内某 Topic 投递给某 Group ID 的消息总量或 TPS(消息消费数据)。
  • 监控报警:您可使用消息队列 MQ 提供的监控报警功能,监控某 Group ID 订阅的某 Topic 的消息消费状态并接收报警短信,帮助您实时掌握消息消费状态,以便及时处理消费异常。

应用场景

  • 削峰填谷:诸如秒杀、抢红包、企业开门红等大型活动时皆会带来较高的流量脉冲,或因没做相应的保护而导致系统超负荷甚至崩溃,或因限制太过导致请求大量失败而影响用户体验,消息队列 MQ 可提供削峰填谷的服务来解决该问题。
  • 异步解耦:交易系统作为淘宝/天猫主站最核心的系统,每笔交易订单数据的产生会引起几百个下游业务系统的关注,包括物流、购物车、积分、流计算分析等等,整体业务系统庞大而且复杂,消息队列 MQ 可实现异步通信和应用解耦,确保主站业务的连续性。
  • 顺序收发:细数日常中需要保证顺序的应用场景非常多,比如证券交易过程时间优先原则,交易系统中的订单创建、支付、退款等流程,航班中的旅客登机消息处理等等。与先进先出(First In First Out,缩写 FIFO)原理类似,消息队列 MQ 提供的顺序消息即保证消息 FIFO。
  • 分布式事务一致性:交易系统、支付红包等场景需要确保数据的最终一致性,大量引入消息队列 MQ 的分布式事务,既可以实现系统之间的解耦,又可以保证最终的数据一致性。
  • 大数据分析:数据在“流动”中产生价值,传统数据分析大多是基于批量计算模型,而无法做到实时的数据分析,利用阿里云消息队列 MQ 与流式计算引擎相结合,可以很方便的实现将业务数据进行实时分析。
  • 分布式缓存同步:天猫双 11 大促,各个分会场琳琅满目的商品需要实时感知价格变化,大量并发访问数据库导致会场页面响应时间长,集中式缓存因为带宽瓶颈限制商品变更的访问流量,通过消息队列 MQ 构建分布式缓存,实时通知商品数据的变化。