引言:一个技术选型的故事

2010年,淘宝的技术团队面临一个棘手的问题:

双11大促期间,订单量瞬间飙升100倍,原有的 ActiveMQ 集群直接崩溃。几百万用户的订单消息堆积,下游系统无法处理,整个交易链路几近瘫痪。

这不是简单的扩容能解决的问题。他们需要一个全新的消息中间件,一个真正理解电商业务、能扛住双11洪峰的消息系统。

这就是 RocketMQ 诞生的开始。

一、RocketMQ 的前世:从 Notify 到 MetaQ

1.1 第一代:Notify(2007-2010)

背景问题:
- 淘宝业务快速增长,系统解耦需求迫切
- 使用 ActiveMQ,遇到性能瓶颈
- 运维成本高,稳定性不足

Notify 1.0 特点:
- 基于 ActiveMQ 5.1 改造
- 增加了消息存储优化
- 简单的集群支持
- 问题:Java 性能瓶颈,10K 消息就卡顿

1.2 第二代:MetaQ(2010-2012)

// MetaQ 的设计转变
// 从 JMS 规范 → 自定义协议
// 从 随机读写 → 顺序写入

public class MetaQDesign {
    // 核心创新:完全顺序写入
    CommitLog commitLog;      // 顺序写入
    ConsumeQueue consumeQueue; // 消费索引

    // 借鉴 Kafka 的设计
    // 但针对电商场景优化
    - 支持事务消息
    - 支持定时消息
    - 支持消息查询
}

MetaQ 的突破

  • 完全重写存储引擎
  • 顺序写入,性能提升 10 倍
  • 支持 10万+ TPS
  • 首次扛住双11(2011年)

二、RocketMQ 的诞生(2012)

2.1 为什么要做 RocketMQ?

MetaQ 2.0 的局限:
1. 运维工具缺失
2. 监控体系不完善
3. 没有消息轨迹
4. 无法支持金融场景

业务新需求:
1. 支付宝接入:金融级可靠性
2. 菜鸟物流:延迟消息
3. 聚划算:事务消息
4. 数据团队:消息轨迹、审计

2.2 RocketMQ 3.0 的革命性改进

// RocketMQ 3.0 核心特性
public class RocketMQFeatures {

    // 1. 事务消息(业界首创)
    @Transaction
    public void placeOrder() {
        // 发送半消息
        sendTransactionMessage(msg);
        // 执行本地事务
        executeLocalTransaction();
        // 提交或回滚消息
        commitOrRollback();
    }

    // 2. 延迟消息(18个级别)
    public void sendDelayMessage() {
        message.setDelayLevel(3); // 10s 后投递
        // 1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
    }

    // 3. 消息轨迹
    @MessageTrace
    public void traceMessage() {
        // 自动记录消息全生命周期
        // 生产 → 存储 → 消费 → 重试
    }

    // 4. 顺序消息
    public void sendOrderlyMessage() {
        // 同一订单的消息保证顺序
        sendMessage(msg, new MessageQueueSelector() {
            public MessageQueue select(List<MessageQueue> mqs, Message msg) {
                String orderId = msg.getProperty("ORDER_ID");
                int index = orderId.hashCode() % mqs.size();
                return mqs.get(index);
            }
        });
    }
}

三、阿里巴巴的 RocketMQ 应用场景

3.1 双11 的考验

双11 RocketMQ 数据(2023):
┌──────────────────────────────────────┐
│ 峰值 TPS:    7500 万条/秒           │
│ 消息总量:    8.1 万亿条             │
│ 集群规模:    10000+ 节点            │
│ 可用性:      99.99%                 │
│ 延迟 P99:    < 10ms                 │
└──────────────────────────────────────┘

关键场景:
1. 交易消息:订单创建 → 库存扣减 → 支付
2. 物流消息:发货通知 → 物流轨迹 → 签收确认
3. 营销消息:红包发放 → 优惠券 → 积分
4. 日志采集:行为日志 → 监控告警 → 数据分析

3.2 金融级应用

// 支付宝转账场景
public class AlipayTransfer {
    @TransactionMessage
    public void transfer(String from, String to, BigDecimal amount) {
        // 1. 发送事务消息(半消息)
        Message msg = new Message("TRANSFER_TOPIC",
            JSON.toJSONString(new TransferDTO(from, to, amount)));
        SendResult result = producer.sendMessageInTransaction(msg, null);

        // 2. 执行本地事务(扣款)
        try {
            accountService.debit(from, amount);
            // 3. 提交消息(确认转账)
            return LocalTransactionState.COMMIT_MESSAGE;
        } catch (Exception e) {
            // 4. 回滚消息(取消转账)
            return LocalTransactionState.ROLLBACK_MESSAGE;
        }
    }

    // 消费端:增加余额
    @MessageListener(topic = "TRANSFER_TOPIC")
    public void handleTransfer(TransferDTO transfer) {
        accountService.credit(transfer.getTo(), transfer.getAmount());
    }
}

3.3 实时数据流

实时计算场景:
┌─────────┐     RocketMQ      ┌──────────┐
│业务系统 │ ──────────────> │ Flink    │
└─────────┘                  └──────────┘
                                  ↓
                             ┌──────────┐
                             │ClickHouse│ 实时报表
                             └──────────┘

应用案例:
- 实时大屏:交易额、订单量、用户数
- 风控系统:异常检测、反欺诈
- 推荐系统:用户行为、实时特征

四、开源之路(2016-至今)

4.1 开源历程

2016.11:开源 RocketMQ 3.2.6
  ↓
2017.02:进入 Apache 孵化器
  ↓
2017.09:成为 Apache 顶级项目(最快毕业)
  ↓
2018.12:RocketMQ 4.0 发布
  - 支持分布式事务
  - Message Trace
  - ACL 权限控制
  ↓
2022.09:RocketMQ 5.0 发布
  - 云原生架构
  - Serverless 支持
  - gRPC 协议

4.2 社区生态

RocketMQ 生态全景:
┌────────────────────────────────────┐
│           应用层                    │
│  电商  金融  物流  游戏  IoT       │
├────────────────────────────────────┤
│           客户端 SDK                │
│  Java  Go  Python  C++  Node.js    │
├────────────────────────────────────┤
│          扩展组件                   │
│  Console  Exporter  Operator       │
├────────────────────────────────────┤
│         核心 RocketMQ               │
│  Broker  NameServer  Proxy         │
├────────────────────────────────────┤
│           存储层                    │
│  Local  DLedger  S3  OSS           │
└────────────────────────────────────┘

五、版本演进与关键特性

5.1 版本对比

版本特性演进:
┌─────────┬──────────────┬────────────────────────┐
│ 版本    │ 发布时间     │ 核心特性               │
├─────────┼──────────────┼────────────────────────┤
│ 3.x     │ 2012-2016    │ 事务/顺序/延迟消息     │
│ 4.0     │ 2017.01      │ SQL过滤、消息轨迹      │
│ 4.3     │ 2018.07      │ 分布式事务消息         │
│ 4.5     │ 2019.03      │ ACL权限、多副本        │
│ 4.7     │ 2020.03      │ Request-Reply 模式     │
│ 4.9     │ 2021.12      │ Trace 优化、性能提升   │
│ 5.0     │ 2022.09      │ 云原生、gRPC、存算分离 │
│ 5.1     │ 2023.03      │ Serverless、弹性伸缩   │
└─────────┴──────────────┴────────────────────────┘

5.2 RocketMQ 5.0 的云原生革命

// RocketMQ 5.0 新架构
public class RocketMQ5Architecture {

    // 1. 存算分离
    class TieredStorage {
        // 热数据:本地 SSD
        LocalStorage hotData;
        // 温数据:对象存储
        ObjectStorage warmData;
        // 冷数据:归档存储
        ArchiveStorage coldData;
    }

    // 2. Serverless 模式
    @Serverless
    class AutoScaling {
        // 自动扩缩容
        void onTrafficChange(int qps) {
            if (qps > threshold) {
                scaleOut();  // 扩容
            } else if (qps < threshold / 2) {
                scaleIn();   // 缩容
            }
        }
    }

    // 3. gRPC 协议支持
    class GrpcClient {
        // 支持流式传输
        StreamObserver<Message> stream = stub.sendMessageStream(responseObserver);
        // 批量发送
        stream.onNext(message1);
        stream.onNext(message2);
        stream.onCompleted();
    }
}

六、RocketMQ vs 其他MQ

6.1 设计理念对比

设计哲学差异:

Kafka:
- 目标:日志系统、流处理
- 优势:极致吞吐量
- 场景:大数据、日志采集

RabbitMQ:
- 目标:AMQP 标准实现
- 优势:灵活路由
- 场景:传统企业集成

RocketMQ:
- 目标:电商业务优化
- 优势:低延迟、金融级可靠
- 场景:交易、支付、电商

Pulsar:
- 目标:云原生设计
- 优势:存算分离、多租户
- 场景:SaaS、云服务

6.2 技术指标对比

性能指标对比(单机):
┌──────────┬──────────┬──────────┬──────────┬──────────┐
│ 指标     │ RocketMQ │ Kafka    │ RabbitMQ │ Pulsar   │
├──────────┼──────────┼──────────┼──────────┼──────────┤
│ TPS      │ 10万     │ 100万    │ 2万      │ 10万     │
│ 延迟     │ < 1ms    │ 2-5ms    │ < 1μs    │ 5ms      │
│ 消息大小 │ 4MB      │ 1MB      │ 128KB    │ 5MB      │
│ 堆积能力 │ 百亿级   │ 百亿级   │ 百万级   │ 百亿级   │
└──────────┴──────────┴──────────┴──────────┴──────────┘

七、为什么选择 RocketMQ?

7.1 技术优势

// 1. 金融级可靠性
- 同步刷盘
- 同步双写
- 3副本存储

// 2. 丰富的消息类型
- 普通消息
- 顺序消息
- 事务消息
- 延迟消息

// 3. 完善的运维工具
- rocketmq-consoleWeb控制台
- rocketmq-exporterPrometheus监控
- mqadmin命令行工具

// 4. 灵活的部署模式
- 单机模式开发测试
- 主从模式生产环境
- Dledger模式自动选主
- 容器化Kubernetes

7.2 适用场景

最适合 RocketMQ 的场景

  • 电商交易系统
  • 金融支付系统
  • 物流追踪系统
  • 实时数据流
  • 分布式事务

⚠️ 需要权衡的场景

  • 超高吞吐(> 百万 TPS):考虑 Kafka
  • 复杂路由:考虑 RabbitMQ
  • 云原生优先:考虑 Pulsar

八、总结:RocketMQ 的独特价值

RocketMQ 不是为了做一个"更好的 Kafka"而生,而是为了解决真实的业务问题而生。它的每一个特性都来自阿里巴巴的实际需求:

  • 事务消息:解决分布式事务问题
  • 延迟消息:解决定时任务场景
  • 顺序消息:解决状态机场景
  • 消息轨迹:解决问题定位难题

正如阿里巴巴中间件团队所说:

“我们不追求 Paper 上的漂亮数字,而是追求真实场景下的稳定可靠。”

下一篇预告

了解了 RocketMQ 的前世今生,下一篇我们将动手实践,通过 Docker 快速搭建 RocketMQ 环境,发送第一条消息,正式开启 RocketMQ 之旅。


思考题

  1. RocketMQ 的事务消息是如何保证分布式事务的?
  2. 为什么 RocketMQ 选择"推拉结合"而不是纯推或纯拉?
  3. 如果让你负责 RocketMQ 6.0 的设计,你会增加什么特性?

欢迎在评论区分享你的想法!