切换主题
16. 练习与验收矩阵:把 RocketMQ 真正学成项目能力
这一章不是新特性,而是把整套订单履约案例收束成可练、可验收、可迁移的能力。
最终业务图
text
下单服务
-> OrderCreated 普通消息
-> OrderPaymentTimeoutCheck 延时消息
支付服务
-> OrderPaid 事务消息
订单状态服务
-> OrderStatusChanged 顺序消息,messageGroup=orderId
通知、积分、库存、风控、运营批处理
-> PushConsumer 或 SimpleConsumer
-> 幂等、重试、补偿、日志、监控能力验收矩阵
| 能力 | 你应该能做到 | 检查标准 |
|---|---|---|
| 普通消息 | 拆出下单旁路动作 | 下单接口不再同步调用通知/积分/仓库 |
| Topic/Tag/Key | 设计消息路由 | 每条消息有业务 key 和清晰 tag |
| PushConsumer | 自动消费 | 消费成功返回 SUCCESS,失败不吞异常 |
| SimpleConsumer | 主动批处理 | 能解释不可见时间和 ack |
| 顺序消息 | 保证局部顺序 | 同一订单用 orderId 做 messageGroup |
| 延时消息 | 到点检查 | 超时关单前查询订单当前状态 |
| 事务消息 | 生产者侧一致性 | 本地事务成功才 commit,支持回查 |
| 异步发送 | 降低主链路等待 | future 成功/失败都有记录 |
| 幂等 | 抗重复投递 | 消费端有唯一幂等键 |
| 补偿 | 失败可恢复 | 有失败记录和补偿入口 |
| 调优 | 处理堆积 | 先查瓶颈,再调线程和实例 |
| ACL | 安全上线 | 密钥不进仓库,环境隔离清楚 |
| 源码排错 | 能定位 starter 问题 | 知道自动配置、template、监听容器入口 |
综合练习一:订单创建
需求:
用户下单后,订单服务只保存订单并发送
OrderCreated。通知服务和积分服务分别消费。
要求:
- 设计 topic、tag、key。
- 写出发送代码。
- 写出两个 consumerGroup。
- 说明短信失败是否影响下单结果。
参考答案:
text
Topic: order-event-topic
Tag: order-created
Key: orderId
ConsumerGroup:
notify-service-group
points-service-group短信失败不影响下单结果。通知服务消费失败时返回失败,进入重试或补偿。
综合练习二:订单状态流转
需求:
同一个订单的状态必须按创建、支付、发货顺序处理。不同订单之间不需要互相等待。
要求:
- 选择消息类型。
- 设计
messageGroup。 - 说明业务层还需要什么保护。
参考答案:
选择顺序消息。messageGroup=orderId。业务层仍要做状态版本校验,防止旧事件覆盖新状态。
综合练习三:支付成功
需求:
支付服务把支付单改成 PAID 后,履约服务必须收到
OrderPaid。
要求:
- 选择消息类型。
- 写出本地事务成功和失败时怎么处理。
- 写出回查依据。
参考答案:
选择事务消息。本地事务成功后 commit,失败后 rollback。回查支付单状态,PAID 则 COMMIT,失败或关闭则 ROLLBACK。
综合练习四:消费失败
需求:
积分服务偶发超时,不能重复加积分,也不能悄悄丢消息。
要求:
- 设计幂等键。
- 说明失败时返回什么。
- 说明补偿记录包含哪些字段。
参考答案:
幂等键优先用 eventId + consumerName。失败时返回 FAILURE。补偿记录包含 eventId、topic、tag、key、payload 摘要、失败原因、重试次数、状态、创建时间。
最终上线检查清单
| 检查项 | 通过标准 |
|---|---|
| 版本 | 使用 rocketmq-v5-client-spring-boot-starter:2.3.4 |
| endpoint | 指向 RocketMQ 5.x Proxy |
| topic | 命名清晰,已创建,权限正确 |
| tag | 能支撑消费者粗过滤 |
| key | 使用业务主键,便于排查 |
| group | 按业务消费者独立设计 |
| 幂等 | 每个消费者都有处理记录 |
| 失败 | 有重试、死信或补偿策略 |
| 日志 | 有 messageId、key、tag、耗时 |
| 监控 | 能看到发送失败、消费失败、堆积 |
| ACL | 密钥不入库,按环境隔离 |
| 排错 | 团队知道 starter 核心源码入口 |
教程审计清单
这套教程每次维护都要检查:
- 是否仍然锁定
rocketmq-v5-client-spring-boot-starter:2.3.4。 - 是否仍围绕订单履约业务成长线。
- 是否每章都有业务问题、技术选择、小技巧和常见坑。
- 是否把 5.x endpoint 模型和旧教程区分清楚。
- 是否有练习题和参考答案。
- 是否能追溯到官方文档或
rocketmq-spring-all-2.3.4源码。