集成必要性功能

This commit is contained in:
2026-03-12 16:25:24 +08:00
parent 5708f80091
commit f0649cb888
201 changed files with 303 additions and 19897 deletions

View File

@@ -1,4 +1,4 @@
# MQ 改造方案(评审稿)
# MQ 改造方案(评审稿)
## 1. 背景与目标
你当前的业务策略是:
@@ -26,16 +26,13 @@
当前 `rdms-spring-boot-starter-mq` 的真实情况:
1. Redis 能力最完整包含模板、监听器抽象、Stream 补偿与清理任务。
2. RabbitMQ 只有 `MessageConverter` 级别自动配置,未形成统一收发抽象。
3. RocketMQ、Kafka 在该 starter 中没有对应自动配置主链路,实际接入主要在 WebSocket 模块。
当前 `rdms-system` 默认配置:
1. `rdms.websocket.sender-type: local`,即默认并未走 MQ 分发链路。
## 3. 改造原则
1. 先配置统一,再接口统一,最后再清理非主路径。
2. 任何阶段都必须可回滚,且回滚只改配置不改代码。
3. 保持 Rabbit/Kafka 包路径存在,避免一次性大删导致历史分支合并困难。
4. 先让 WebSocket 场景打通可切换,再考虑扩展到业务 MQ。
## 4. 目标架构(落地后)
统一引入配置:
@@ -44,10 +41,8 @@
统一行为:
1. 单体环境配 `redis`
2. 微服务环境配 `rocketmq`
3. WebSocket `sender-type` 跟随 `rdms.mq.type`,避免双配置。
建议方式:
1. `rdms.websocket.sender-type: ${rdms.mq.type}`
## 4.1 配置矩阵(最小可运行)
@@ -56,8 +51,6 @@
rdms:
mq:
type: redis
websocket:
sender-type: ${rdms.mq.type}
spring:
data:
@@ -71,8 +64,6 @@ spring:
rdms:
mq:
type: rocketmq
websocket:
sender-type: ${rdms.mq.type}
rocketmq:
name-server: 127.0.0.1:9876
@@ -102,7 +93,6 @@ rocketmq:
实施项:
1. 新增配置项 `rdms.mq.type`,默认值 `redis`
2. 修改环境配置,使 `rdms.websocket.sender-type` 引用 `rdms.mq.type`
3. 本阶段不删除 Rabbit/Kafka 代码,不变更包结构。
收益:
@@ -110,7 +100,6 @@ rocketmq:
2. 不触碰核心业务逻辑,风险最低。
回滚:
1.`rdms.websocket.sender-type` 改回固定值即可。
## 阶段 B中风险接口统一
目标:抽象统一 MQ 发送接口,减少业务对具体中间件的耦合。
@@ -119,7 +108,6 @@ rocketmq:
1. 新增统一接口,例如 `UnifiedMqSender`
2. 提供 `RedisMqSender``RocketMqSender` 两个实现。
3.`@ConditionalOnProperty` 根据 `rdms.mq.type` 注入唯一实现。
4. 在 WebSocket 发送链路优先替换为统一接口调用。
5. 统一消息契约,至少包含标准消息头:
`msgId``bizKey``timestamp``producer``traceId``version`
@@ -149,7 +137,6 @@ rocketmq:
## 6. 影响面评估
主要影响模块:
1. `rdms-framework/rdms-spring-boot-starter-mq`
2. `rdms-framework/rdms-spring-boot-starter-websocket`
3. `rdms-system/rdms-system-boot` 配置文件
主要风险点:
@@ -182,7 +169,6 @@ rocketmq:
## 7. 验收清单(每阶段都要过)
1. 单体环境 `rdms.mq.type=redis` 可启动、可发送、可消费。
2. 微服务环境 `rdms.mq.type=rocketmq` 可启动、可发送、可消费。
3. WebSocket 在两种模式下都能完成跨实例消息投递。
4. 关键链路日志可定位发送端与消费端。
5. 切换只改配置,不改代码。
6. 回滚路径已验证。
@@ -224,7 +210,6 @@ rocketmq:
3. 关键业务出现重复消费副作用。
回滚动作:
1. 只回滚 `rdms.mq.type``rdms.websocket.sender-type` 配置。
2. 不回滚代码,确保恢复路径最短。
## 9. 当前建议

View File

@@ -52,7 +52,6 @@ Redis 相关能力分成两类:
### 6. 多 MQ 的真实边界
虽然模块描述写了支持 Redis / RocketMQ / RabbitMQ / Kafka
但本 starter 的自动配置主要是 Redis + Rabbit。
RocketMQ / Kafka 的业务化接入在 `rdms-spring-boot-starter-websocket` 里有更完整示例。
## 自动配置入口
`META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports`:
@@ -78,13 +77,6 @@ RocketMQ / Kafka 的业务化接入在 `rdms-spring-boot-starter-websocket` 里
2. 先按第 2 节使用 `Pub/Sub`(这是项目里最常见路径)。
3. 需要可恢复消费时,再按第 3 节接入 `Stream`
WebSocket 场景建议:
1. 多实例广播: `rdms.websocket.sender-type: redis`
2. 单机部署: 保持 `rdms.websocket.sender-type: local`
说明:
1. 只要存在 `AbstractRedisChannelMessageListener` Bean框架会自动注册 Redis 监听容器。
## 2. 使用 Redis Pub/Sub广播
适用场景: 通知广播、在线会话广播、对可靠性要求不高但强调实时性。
@@ -232,13 +224,6 @@ public class DemoRedisMessageInterceptor implements RedisMessageInterceptor {
1. Redis Stream 要求 Redis 版本 >= 5.0
2. 只有存在 Stream 监听器时,重投/清理定时任务才会生效
## 与 WebSocket 的关系
`rdms-spring-boot-starter-websocket` 直接复用本模块能力:
1. `sender-type=redis` 时使用 `RedisMQTemplate` + `AbstractRedisChannelMessageListener`
2. `sender-type=rabbitmq/rocketmq/kafka` 时切换到对应中间件实现
你可以参考 websocket 模块作为本模块的落地样板。
## 当前已知注意点
1. `AbstractRedisStreamMessageListener` 有一个 `(streamKey, group)` 构造器,内部把 `messageType` 置空;而消费反序列化仍依赖 `messageType`
建议优先使用无参构造路径(即泛型推断消息类型的默认方式)。