引言:Serverless 的魅力

传统模式:搭建集群、调优参数、监控运维…还要为闲置资源付费。

Serverless 模式:直接使用,按消息数量付费,无需关心底层基础设施。

Serverless 的核心理念

  • ✅ 零运维(NoOps)
  • ✅ 按量付费(Pay-as-you-go)
  • ✅ 自动弹性伸缩
  • ✅ 专注业务逻辑

本文目标

  • 理解 Serverless MQ 架构
  • 对比云厂商 Serverless 方案
  • 实战阿里云/AWS 的 Serverless MQ
  • 掌握最佳实践

一、Serverless MQ 架构

1.1 传统 vs Serverless

传统模式:
┌─────────────────────────────────────┐
│  用户负责                            │
│  ├─ 集群规划                         │
│  ├─ 容量评估                         │
│  ├─ 部署运维                         │
│  ├─ 监控告警                         │
│  ├─ 故障处理                         │
│  └─ 性能调优                         │
└─────────────────────────────────────┘

Serverless 模式:
┌─────────────────────────────────────┐
│  云厂商负责                          │
│  ├─ 自动扩缩容                       │
│  ├─ 高可用保障                       │
│  ├─ 监控运维                         │
│  └─ 性能优化                         │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│  用户只需                            │
│  └─ 发送/接收消息                    │
└─────────────────────────────────────┘

1.2 Serverless MQ 特点

特性传统模式Serverless 模式
运维复杂度
成本模式按实例付费按消息数量付费
扩容速度分钟级秒级
最小成本固定成本0(无消息时无费用)
技术门槛

二、主流云厂商方案

2.1 阿里云 - 消息队列 RocketMQ 版(Serverless)

产品介绍

  • 完全托管的 RocketMQ 服务
  • 支持 Serverless 和标准版
  • 兼容开源 RocketMQ 4.x/5.x

定价模型

Serverless 版:
- API 调用费:¥0.8 / 百万次
- 消息存储费:¥0.5 / GB / 天
- 流量费:¥0.8 / GB

标准版(对比):
- 实例费:¥888 / 月起
- 按规格固定收费

快速开始

  1. 创建实例(Web 控制台)
控制台 → 消息队列 RocketMQ 版 → 创建实例
→ 选择 Serverless 版
→ 选择地域(如:华东1-杭州)
→ 创建完成(秒级)
  1. 创建 Topic
实例详情 → Topic 管理 → 创建 Topic
→ Topic 名称:order_topic
→ 消息类型:普通消息
→ 创建
  1. Java SDK 使用
<!-- Maven 依赖 -->
<dependency>
    <groupId>com.aliyun.openservices</groupId>
    <artifactId>ons-client</artifactId>
    <version>2.0.4.Final</version>
</dependency>
// Producer 示例
Properties properties = new Properties();
properties.put(PropertyKeyConst.NAMESRV_ADDR, "rmq-xxx.mq-internet-access.mq-internet.aliyuncs.com:80");
properties.put(PropertyKeyConst.AccessKey, "YOUR_ACCESS_KEY");
properties.put(PropertyKeyConst.SecretKey, "YOUR_SECRET_KEY");

Producer producer = ONSFactory.createProducer(properties);
producer.start();

Message msg = new Message("order_topic", "TagA", "Hello Serverless MQ".getBytes());
SendResult sendResult = producer.send(msg);
System.out.println("消息ID: " + sendResult.getMessageId());

2.2 AWS - Amazon MQ for RocketMQ

产品介绍

  • AWS 托管的 RocketMQ 服务
  • 支持多可用区部署
  • 与 AWS 生态深度集成

定价模型

实例费:
- mq.t3.micro:$0.055 / 小时
- mq.m5.large:$0.334 / 小时

存储费:
- $0.10 / GB / 月

数据传输费:
- 区域内免费
- 跨区域:$0.01 / GB

快速开始

  1. 创建 Broker(AWS 控制台)
# 或使用 CLI
aws mq create-broker \
  --broker-name my-rocketmq-broker \
  --engine-type ROCKETMQ \
  --engine-version 5.0.0 \
  --host-instance-type mq.t3.micro \
  --deployment-mode SINGLE_INSTANCE \
  --publicly-accessible true
  1. Java SDK 使用
// 使用标准 RocketMQ 客户端
DefaultMQProducer producer = new DefaultMQProducer("producer_group");
producer.setNamesrvAddr("b-xxx.mq.us-east-1.amazonaws.com:9876");
producer.start();

Message msg = new Message("order_topic", "Hello AWS MQ".getBytes());
producer.send(msg);

2.3 腾讯云 - TDMQ RocketMQ 版

产品介绍

  • 腾讯云托管的 RocketMQ 服务
  • 完全兼容 Apache RocketMQ

定价模型

按量计费:
- API 调用:¥1.0 / 百万次
- 消息存储:¥0.45 / GB / 天

包年包月:
- ¥699 / 月起

快速开始

// 使用腾讯云 SDK
Properties properties = new Properties();
properties.put("NAMESRV_ADDR", "rocketmq-xxx.tencenttdmq.com:9876");
properties.put("AccessKey", "YOUR_ACCESS_KEY");
properties.put("SecretKey", "YOUR_SECRET_KEY");

Producer producer = ONSFactory.createProducer(properties);
producer.start();

三、成本对比

3.1 使用场景分析

场景1:低频使用(每天 10 万条消息)

自建集群:
- 2台 Broker(最小配置)
- 成本:约 ¥2000 / 月

Serverless(阿里云):
- API 调用费:10万 × 30 × 0.8 / 100万 = ¥24
- 存储费:几乎可忽略
- 总成本:约 ¥30 / 月

节省:93%

场景2:中频使用(每天 1000 万条消息)

自建集群:
- 6台 Broker(中等配置)
- 成本:约 ¥10000 / 月

Serverless:
- API 调用费:1000万 × 30 × 0.8 / 100万 = ¥2400
- 存储费:约 ¥500
- 总成本:约 ¥2900 / 月

节省:71%

场景3:高频使用(每天 1 亿条消息)

自建集群:
- 12台 Broker(高配)
- 成本:约 ¥30000 / 月

Serverless:
- API 调用费:1亿 × 30 × 0.8 / 100万 = ¥24000
- 存储费:约 ¥5000
- 总成本:约 ¥29000 / 月

节省:3%(成本相当,但无运维成本)

结论

  • 低频场景:Serverless 绝对优势
  • 中频场景:Serverless 有优势
  • 高频场景:成本相当,但 Serverless 省去运维成本

四、最佳实践

4.1 什么时候选 Serverless?

适合 Serverless

  • 初创公司/小团队
  • 流量波动大
  • 无专职运维
  • 低频使用场景
  • 快速上线需求

不适合 Serverless

  • 超高频场景(成本考虑)
  • 需要深度定制
  • 对延迟极度敏感(< 1ms)
  • 数据必须私有化部署

4.2 成本优化技巧

1. 消息批量发送

// 单条发送:100 万次 API 调用
for (int i = 0; i < 1000000; i++) {
    producer.send(new Message("topic", msg.getBytes()));
}

// 批量发送:1 万次 API 调用(降低 99% 费用)
List<Message> messages = new ArrayList<>(100);
for (int i = 0; i < 1000000; i++) {
    messages.add(new Message("topic", msg.getBytes()));
    if (messages.size() == 100) {
        producer.send(messages);  // 批量发送
        messages.clear();
    }
}

2. 调整消息保留时间

默认保留:7 天
按需调整:1 天(降低 85% 存储费用)

3. 消息压缩

// 启用压缩,减少存储和流量费用
producer.setCompressMsgBodyOverHowMuch(4096);  // 超过 4KB 压缩

4.3 监控与告警

阿里云监控

云监控 → 消息队列 RocketMQ → 实例监控
- TPS
- 消息堆积量
- API 调用次数
- 存储用量

告警配置

告警规则:
- 消息堆积 > 10 万条
- API 调用失败率 > 1%
- 存储费用 > 预算

五、迁移指南

5.1 从自建迁移到 Serverless

步骤

  1. 创建 Serverless 实例
  2. 创建 Topic 和 Group(与自建集群保持一致)
  3. 配置双写(Producer 同时发送到两个集群)
// 双写代码示例
producer1.send(msg);  // 发送到自建集群
producer2.send(msg);  // 发送到 Serverless 集群
  1. 切换 Consumer(逐步迁移消费者)
1. 10% Consumer 切换到 Serverless
2. 观察 24 小时
3. 50% Consumer 切换
4. 100% 完成迁移
  1. 停止双写,下线自建集群

5.2 迁移检查清单

  • 功能兼容性验证
  • 性能压测(TPS、延迟)
  • 成本预算评估
  • 监控告警配置
  • 灰度迁移计划
  • 回滚方案准备

六、局限性

6.1 当前限制

限制项自建Serverless
最大消息大小4MB256KB(阿里云)
单 Topic TPS无限制5000(可申请提升)
消息保留时间自定义最长 7 天
延迟消息级别18 个18 个
事务消息支持部分支持

6.2 应对策略

消息大小限制

  • 大消息拆分
  • 使用对象存储(消息只存 URL)

TPS 限制

  • 申请提升配额
  • 使用多个 Topic 分散流量

七、总结

Serverless MQ 核心价值

1. 零运维:无需关心基础设施
2. 低成本:按需付费,无闲置浪费
3. 高弹性:自动扩缩容,应对流量峰值
4. 快速上线:分钟级开通,立即使用

选择建议

场景推荐方案
初创公司Serverless
中小企业Serverless
大型企业(低频)Serverless
大型企业(高频)自建 或 混合
特殊需求(定制)自建

下一篇预告:《RocketMQ Streams - 轻量级流处理框架》,探索 RocketMQ 的流计算能力。

本文关键词Serverless 按量付费 云原生 零运维