feat(GOV-008): 采用 RocketMQ 消息队列架构

This commit is contained in:
2026-08-13 14:22:50 +08:00
parent 3cc00de8f6
commit f5994ad77e
34 changed files with 463 additions and 43 deletions
@@ -0,0 +1,45 @@
# RocketMQ 消息队列架构调整设计
- 功能编号:GOV-008
- 设计版本:0.1
- 状态:approved
- 日期:2026-08-13
## 架构
```text
Scheduler
-> MessageBusAdapter.publish()
-> RocketMQ 5.x Proxy 或受支持客户端
-> NameServer / Broker
-> MessageBusAdapter.consume()
-> Worker
-> Redis 当前状态 + MySQL 事实记录
```
`MessageBusAdapter` 是稳定边界。业务消息、Topic 和 Group 不引用 RocketMQ SDK 类型,未来客户端实现变化不要求重写调度与分析逻辑。项目只维护 RocketMQ 一套实现,不同时维护 RabbitMQ 兼容层。
## 接入模式
推荐 Node.js 通过 RocketMQ 5.x Proxy 接入,以降低对旧 Remoting 客户端实现的依赖。若后续选定的 Node 客户端直接连接 NameServer/Broker,必须先验证客户端维护状态、RocketMQ 5.3.2 兼容性、重试语义和优雅关闭,再通过 Adapter 接入。
`ROCKETMQ_NAMESRV_ADDR` 用于基础设施发现和诊断,`ROCKETMQ_ENDPOINT` 是应用客户端实际接入地址。两者不得混为同一项:只有 NameServer 端口可达时,不能完成生产或消费。
## Topic 与 Group
- Topic 前缀固定为 `a-share-analysis`,实际 Topic 按业务域追加,例如行情采集或指标计算。
- Tag 使用稳定事件类型,不用临时任务 ID。
- RocketMQ 5.x Proxy Producer 不配置 Producer Group;Worker 按独立消费语义使用 Consumer Group。
- 环境隔离通过受控前缀或独立集群完成,禁止开发消费者读取生产 Topic。
## 可靠性
RocketMQ 提供至少一次投递语义,Worker 必须幂等。消息处理完成并形成可验证结果后才能确认;可重试错误返回重试,永久错误记录原因后进入死信。顺序消息只在明确消息组键内保证,不假设跨证券或跨交易日全局顺序。
最大投递次数是 Consumer Group 的服务端重试策略,由 RocketMQ 运维配置和发布检查负责。应用客户端只声明 Consumer Group、并发与处理结果,不能用一个不会被官方 Node SDK读取的 env 字段假装控制死信边界。
## 本地状态
2026-08-13 首次检查到 `apache/rocketmq:5.3.2` 的 `rmqnamesrv` 容器曾运行并映射 `9876:9876`,日志为 NameServer boot success;随后串行复核发现该容器已以 137 退出且未配置自动重启,`OOMKilled=false`。
宿主机 `9876` 实际由 `/usr/local/rocketmq` 的原生 NameServer 监听,同时存在 `mqbroker --enable-proxy`。只读 `mqadmin` 验证结果:`broker-a` 已注册,版本 `V5_3_2`、`brokerActive=true`,Broker 地址 `192.168.2.37:10911`;本机 `10911`、Proxy `8081` 和 NameServer `9876` 均可达,Topic 列表可读取。当前可确认 RocketMQ 基础设施和管理链路连通,但尚未通过项目 Node 客户端执行消息收发。
@@ -0,0 +1,20 @@
# GitNexus 开发后基线
## 状态
```text
Repository: /Users/citrons/Documents/Codex/2026-08-12/wo-x/a-share-analysis
Indexed: 8/13/2026, 2:12:02 PM
Indexed commit: 3cc00de
Current commit: 3cc00de
Status: ✅ up-to-date
```
## 图谱规模
- 949 个节点。
- 1132 条关系。
- 13 个聚类。
- 23 条流程。
本次新增内容以文档、环境模板和契约测试为主,没有新增 MQ 运行时代码或执行流。
@@ -0,0 +1,26 @@
# GitNexus 开发前基线
- 功能编号:GOV-008
- 记录时间:2026年8月13日 GMT+8 13:59:16
- 分支:main
- 基线提交:3cc00de8f65e
## 工作区
```text
(干净)
```
## GitNexus 状态
```text
Repository: /Users/citrons/Documents/Codex/2026-08-12/wo-x/a-share-analysis
Indexed: 8/13/2026, 1:59:15 PM
Indexed commit: 3cc00de
Current commit: 3cc00de
Status: ✅ up-to-date
```
## 后续人工分析
在修改代码前,将 GitNexus query、context、impact 的结论写入 `gitnexus/impact-plan.md`。高风险结果必须先获得用户确认。
@@ -0,0 +1,14 @@
# GitNexus 前后对比
## 开发前
- 基线提交:`3cc00de`
- RabbitMQ 仅存在于文档、模板和契约测试,没有运行时代码或执行流。
## 开发后
- 当前活动架构统一为 RocketMQ 5.x。
- 新增 MessageBusAdapter、Topic/Tag/Group、重试、死信、幂等和顺序键约束。
- GitNexus 变更检测为 LOW,0 条执行流受影响。
结论:调整发生在实现客户端之前,避免了双栈迁移;后续真实风险集中在 Node 客户端与 RocketMQ 5.3.2 的契约验证。
@@ -0,0 +1,10 @@
# GitNexus 变更检测
- 检测日期:2026-08-13
- 范围:unstaged
- 变更文件:16 个已跟踪文件,另含 GOV-008 功能档案与 ADR 新文件。
- 变更符号:35
- 受影响流程:0
- 风险:LOW
变更集中在当前架构、环境模板、部署说明、代码规范和环境契约测试。GitNexus 未发现市场业务、数据库、HTTP 或消息运行流程受影响,因为 Server 和 MQ 客户端尚未实现。
@@ -0,0 +1,13 @@
# GitNexus 开发前影响分析
- 分析日期:2026-08-13
- 基线提交:`3cc00de`
- 索引状态:up-to-date
查询 RabbitMQ、消息队列、Scheduler、Worker 和部署配置。当前仓库没有 Server 生产代码或 MQ 执行流,影响集中在系统架构、代码开发规范、环境模板、部署文档和环境契约测试。
- `environment-baseline.test.mjs`:LOW,无上游调用方或业务流程。
- `system-architecture.md`:LOW,直接引用方为 README 与文档索引。
- `code-development-standards.md`:LOW,直接引用方为 README 与文档索引。
结论:不影响市场业务、数据库或 HTTP 运行流程。主要风险是环境键漂移和把 NameServer 可达误判为消息链路可用,分别由契约测试和分层连接证据控制。
@@ -0,0 +1,13 @@
# GOV-008 实施计划
- [x] 封存并推送 `v0.0.6` 开发库 N/A Schema 基线。
- [x] 执行 `governance:start` 与 GitNexus 开发前探索和影响分析。
- [x] 先修改环境契约测试,确认旧 RabbitMQ 配置使测试失败。
- [x] 将 Scheduler/Worker 开发和生产模板改为 `ROCKETMQ_*`。
- [x] 更新系统架构、代码开发规范、部署文档和未发布市场概览 PRD。
- [x] 补齐 GOV-008 功能档案和本机连接验证证据。
- [x] 运行治理、MySQL、环境、Schema 测试和配置/文档检查。
- [x] 执行 GitNexus 变更检测、代码 Review 与规范 Review。
- [x] 执行 `governance:finish`,中文提交并推送 Gitea。
本版本不实现客户端、不创建 Broker/Proxy、不发送测试消息。后续 Server 脚手架功能负责选型 Node 客户端并完成真实 Topic 收发契约测试。
@@ -0,0 +1,18 @@
id: GOV-008
name: RocketMQ 消息队列架构调整
slug: rocketmq-adoption
status: released
owner: project
created_at: 2026-08-13
prd: prd.md
requirements: requirements.md
design: design.md
implementation_plan: implementation-plan.md
test_plan: test-plan.md
gitnexus_before: gitnexus/before.md
gitnexus_after: gitnexus/after.md
gitnexus_comparison: gitnexus/comparison.md
code_review: review/code-review.md
standards_review: review/standards-review.md
implementation_commit: pending
release: v0.0.7
@@ -0,0 +1,33 @@
# RocketMQ 消息队列架构调整 PRD
- 功能编号:GOV-008
- PRD 版本:0.1
- 状态:approved
- 日期:2026-08-13
## 问题
项目早期约定 RabbitMQ,但尚未实现消息客户端或业务消息链路。现决定统一采用 RocketMQ,并需要在服务脚手架落地前同步架构、环境契约和部署边界,避免后续同时维护两套消息模型。
## 目标
- 项目唯一消息队列调整为 RocketMQ 5.x。
- Scheduler 和 Worker 通过 `MessageBusAdapter` 使用版本化消息契约。
- 配置明确区分 NameServer、Broker/Proxy Endpoint、Topic 和 Group。
- 保留本地默认关闭策略,同时允许连接独立运行的本机 RocketMQ。
- 检查当前本机 Docker RocketMQ 的实际连通状态,不夸大验证范围。
## 非目标
- 本版本不实现 Server、Scheduler、Worker 或 RocketMQ Node 客户端。
- 不替用户创建、删除或重启 Docker 或本机 RocketMQ 进程。
- 不连接生产 RocketMQ,不创建生产 Topic 或 Group。
- NameServer 可达时不宣称消息生产和消费已经可用。
## 验收标准
- 当前架构、开发规范、部署说明和环境模板只采用 RocketMQ。
- Scheduler 与 Worker 开发/生产模板键集合分别一致,且无 RabbitMQ 变量。
- 文档定义重复投递、幂等、重试、死信和顺序消息边界。
- 本机 NameServer 的版本、端口和启动状态有可复核证据。
- 诊断必须区分 Docker 容器与本机原生进程,并报告 NameServer、Broker、Proxy 的真实状态。
@@ -0,0 +1,18 @@
# 测试结果
- 日期:2026-08-13
- 状态:passed
测试先行阶段,环境契约测试按预期因缺少 `ROCKETMQ_*` 和活动文档仍包含 RabbitMQ 而失败。实现后结果:
- 治理测试:5/5 passed。
- MySQL 5.7 基线测试:2/2 passed。
- 环境与部署契约测试:7/7 passed。
- Schema 基线测试:23/23 passed。
- `npm run schema:verify`:`v0.0.6 (not_applicable)` passed。
- `git diff --check` 与 Node 语法检查:passed。
- 活动架构、部署、治理规范与环境模板 RabbitMQ 残留扫描:passed。
- `npm run governance:finish -- GOV-008 rocketmq-adoption`:passed。
- 独立代码 Review 与开发规范 Review:passed。
本机诊断确认:Docker `rmqnamesrv` 容器曾启动成功但现已以 137 退出,且非 OOM;宿主机原生 RocketMQ 5.3.2 正在运行 NameServer、`broker-a` 和 Proxy。`9876`、`10911`、`8081` 可达,`mqadmin` 可读取集群、Topic 和 Broker 状态。项目 Node 客户端尚未实现,因此未创建 Topic 或写入测试消息。
@@ -0,0 +1,5 @@
# 视觉 QA
本功能没有页面、组件、样式或浏览器交互变化,视觉 QA 不适用。
结论:not_applicable
@@ -0,0 +1,6 @@
# 发布说明
- 项目消息队列技术基线由 RabbitMQ 调整为 RocketMQ 5.x。
- Scheduler 和 Worker 配置切换为 `ROCKETMQ_*`,并明确 Topic、Group、重试和接入地址。
- 增加 `MessageBusAdapter` 边界,避免业务绑定具体客户端。
- 本机原生 RocketMQ 5.3.2 NameServer、Broker 和 Proxy 已验证可达,Broker 已注册且状态正常;Docker `rmqnamesrv` 容器已退出,项目消息收发待 Node 客户端落地后验证。
@@ -0,0 +1,29 @@
# 工程需求
## 技术基线
- MQ 固定为 RocketMQ 5.x,当前本机镜像版本为 `apache/rocketmq:5.3.2`。
- 业务模块只依赖 `MessageBusAdapter` 与版本化事件,不直接引用客户端 SDK 类型。
- Scheduler 只发布任务,Worker 只消费执行;重复投递由幂等键和业务唯一约束处理。
## 配置契约
- Scheduler 使用 `ROCKETMQ_ENABLED`、`ROCKETMQ_NAMESRV_ADDR`、`ROCKETMQ_ENDPOINT`、`ROCKETMQ_TOPIC_PREFIX` 和发送超时。RocketMQ 5.x Proxy 官方 Node Producer 不要求 Producer Group,禁止把旧 Remoting 参数混入配置。
- Worker 使用相同的基础连接字段,并增加 `ROCKETMQ_CONSUMER_GROUP` 和客户端消费并发。
- 开发和生产模板的同一进程必须保持相同键集合;生产连接地址留空且不得提交真实值。
- `ROCKETMQ_ENABLED=false` 时不建立连接;启用后 Endpoint、Topic 和对应 Group 必须通过启动配置 Schema 校验。
## 消息语义
- 事件必须包含 `eventId`、`eventType`、`schemaVersion`、`occurredAt`、`tradeDate`、`traceId` 和 `idempotencyKey`。
- Topic 表达稳定业务域,Tag 表达事件类型,Consumer Group 表达独立消费进度。
- 需要顺序处理时必须声明消息组键;普通消息不保证全局顺序。
- 超过最大消费次数后进入死信,必须支持查询、告警和受控重放。
- 最大投递次数属于 RocketMQ 服务端 Consumer Group 重试策略,由运维配置并纳入部署验收,不作为官方 Node PushConsumer 的客户端环境变量。
## 本机验证
- 检查容器、镜像、端口映射和 NameServer 启动日志。
- 使用 TCP 探针验证 `127.0.0.1:9876`。
- 检查 Docker 容器和本机原生进程,避免把相同端口的其他监听者误判为目标容器。
- 通过 `mqadmin clusterList`、`topicList`、`brokerStatus` 确认 Broker 注册、版本和管理链路;不擅自创建 Topic 或写入测试消息。
@@ -0,0 +1,22 @@
# 代码 Review
## 第一轮
结论:changes_required。发现 2 个 Important:配置混入旧 Remoting Producer Group 和无效的客户端最大重试字段;RabbitMQ 残留断言只覆盖生产 Worker。
## 处置
- 删除 `ROCKETMQ_PRODUCER_GROUP` 和 `ROCKETMQ_MAX_RECONSUME_TIMES`。
- 明确最大投递次数属于服务端 Consumer Group 运维策略。
- 扩展测试覆盖 Scheduler/Worker 的开发与生产四份模板,同时核对开发和生产连接地址边界。
## 最终复审
- 四份 Scheduler/Worker 模板均移除旧 RabbitMQ 字段、旧 Remoting Producer Group 和无效的客户端最大重试字段。
- 开发模板统一使用 `127.0.0.1:9876` 和 `127.0.0.1:8081` 且保持关闭;生产连接地址保持空值。
- 最大投递次数归属服务端 Consumer Group 运维策略,文档和配置语义一致。
- 环境 7/7、治理 5/5、MySQL 2/2、Schema 23/23 及 Schema 验证通过。
Critical、Important、Minor 均无未关闭项。
最终结论:passed
@@ -0,0 +1,12 @@
# 开发规范符合性 Review
## 检查结果
- PRD、需求、设计、实施计划、测试计划、回退和 GitNexus 档案齐全。
- 技术基线统一为 RocketMQ 5.x,历史档案保留原版本事实。
- 配置模板无秘密,开发与生产同进程键集合一致,生产连接地址为空。
- Node.js 接入边界明确采用 MessageBusAdapter,未提前绑定未经验证的 SDK 参数。
- 本机诊断只读执行,未创建 Topic、未发送消息、未修改或重启用户进程。
- 测试先行、GitNexus 影响分析和独立复审证据齐全。
最终结论:passed
@@ -0,0 +1,7 @@
# 回退说明
本功能只修改架构约定、无秘密环境模板、文档和契约测试,没有启动、停止或修改用户的 Docker 容器,也没有连接生产服务。
若后续 RocketMQ 客户端验证失败,使用新的治理功能和中文提交调整 Adapter 实现或接入方式;不得在业务代码中临时绕过 Adapter。回退文档配置时可以恢复上一已发布提交,但必须同步恢复开发/生产模板和契约测试,禁止形成一半 RabbitMQ、一半 RocketMQ 的混合状态。
本机 `rmqnamesrv` 容器及其 Docker 网络属于用户环境,不由仓库回退操作管理。
@@ -0,0 +1,19 @@
# 测试计划
## 自动化
- 开发和生产同进程环境键一致。
- 生产模板禁止模拟数据并保持 MySQL 5.7 与 RocketMQ 开关契约。
- 活动架构和部署文档包含 RocketMQ 且不再包含 RabbitMQ。
- 本地 Compose 仍只启动 Redis,不隐式增加 RocketMQ 生命周期。
- 治理、MySQL 5.7、Schema 基线回归测试全部通过。
## 本机诊断
- `docker ps` 与本机进程检查 NameServer、Broker、Proxy,定位端口真实监听者。
- `docker inspect rmqnamesrv` 核对镜像与端口映射。
- `docker logs rmqnamesrv` 核对启动成功日志。
- `nc` 检查 `9876`、`10911` 和 `8081` TCP 可达。
- `mqadmin clusterList`、`topicList`、`brokerStatus` 检查 Broker 注册、Topic 路由与运行状态。
基础设施管理链路已验证。由于项目 Server 与 Node 客户端尚未实现,本版本不创建测试 Topic,也不执行项目消息生产和消费,并将此限制记录为未执行项。