feat: complete cmpp platform phases 0-5

This commit is contained in:
hectorzhao
2026-07-01 13:22:04 +08:00
parent 824a8b334f
commit ee926fea04
86 changed files with 10490 additions and 14 deletions
+78
View File
@@ -0,0 +1,78 @@
# 阶段 0 开源 CMPP 技术初评
核验日期:2026-07-01
## 初步结论
- `bigwhite/gocmpp` 更符合本项目“复用协议层、服务层自研”的方向,可作为第一优先协议库候选。
- `JoeCao/cmpp-gateway` 更接近完整 HTTP 网关,不建议直接绑定业务模型;适合参考连接模型、重连、SEQID/MSGID 追踪、模拟器和降级设计。
- 当前已完成 Go 1.26.4 下的 gocmpp 编译级接入、本地 TCP connect/submit/active test 测试和 deliver 回执 PDU 测试。
- 阶段 0 决策:第一版协议层优先直接依赖 gocmpp,暂不 fork;服务层连接管理、重连、SEQID/MSGID 追踪、队列、限速、监控、幂等由本项目自研。
## bigwhite/gocmpp
来源:
- GitHubhttps://github.com/bigwhite/gocmpp
- pkg.go.devhttps://pkg.go.dev/github.com/bigwhite/gocmpp
### 已确认信息
- GitHub 标注 License 为 Apache-2.0。
- 项目定位是 Go CMPP 协议库,可用于 client 和 server side。
- README/pkg.go.dev 描述覆盖 CMPP 2.x 和 CMPP 3.x。
- 已支持 connect、submit、deliver、fwd、active test、terminate。
- query、cancel、route 等较少使用包未支持,且不在路线图中。
- pkg.go.dev 可见基础连接 API,如 `Conn``SendPkt``RecvAndUnpackPkt``Server`
- 本地通过 `goproxy.cn` 成功解析 `github.com/bigwhite/gocmpp v0.0.0-20240917054108-b238366bff0b``golang.org/x/text v0.3.8`
- Gateway Spike 已创建 `internal/cmpp` 编译级适配测试,验证 `NewClient`、CMPP 2.0/3.0 类型映射可编译。
- Gateway Spike 已创建本地 TCP 集成测试,验证 CMPP 3.0 connect、submit、submit resp、active test。
- Gateway Spike 已创建 deliver 回执 pack/unpack 测试,验证 `DELIVRD` 状态报告可解析。
### 对本项目的价值
- 可降低从零实现 PDU 编解码、连接包、submit、deliver、active test、terminate 的风险。
- 支持 client/server 双侧能力,有利于本地模拟 SMSC 和 Gateway 联调。
- Apache-2.0 对商业项目相对友好,但仍需最终法务或项目负责人确认。
### 待实测问题
- Linux 编译情况。
- 长短信拆分、UCS2、GBK/GB18030 编码稳定性。
- submit resp 与 deliver 状态报告解析是否满足运营商实际格式。
- 高并发 submit 下 sequence 管理、窗口控制和错误恢复能力。
- 是否需要 fork 修补现代依赖、日志、context、超时、指标等工程化能力;阶段 0 暂不 fork。
## JoeCao/cmpp-gateway
来源:
- GitHubhttps://github.com/JoeCao/cmpp-gateway
### 已确认信息
- 项目定位是 CMPP 3.0 HTTP 网关,将 CMPP 协议转换为 HTTP API。
- README 描述包含单连接多协程模型:Receiver、Sender、Heartbeat。
- README 描述包含 SEQID 到 Message、MSGID 到 Message 的追踪链路。
- README 描述内置心跳检测、断线重连、连接降级提示。
- README 描述支持 BoltDB 和 Redis 做状态追踪。
- README 描述包含本地 CMPP 模拟器,支持 CMPP 3.0 和 2.0、submit 成功响应、心跳保活和协议日志。
- README 描述技术栈使用 Go 1.21+、gocmpp、Redis、标准库 net/http、GB18030。
### 对本项目的价值
- 可参考连接、重连、接收、发送和心跳协程的职责拆分。
- 可参考 SEQID/MSGID 映射缓存设计,但本项目需改为以平台 `messageId` 为主键,和 NestJS/BullMQ 事件贯通。
- 可参考模拟器设计,快速补齐 connect、submit resp、deliver、active test 和异常场景。
### 不建议直接采用的原因
- 它是完整 HTTP 网关,包含 HTTP API、Web UI、本地存储等服务层设计,和本项目“业务后台由 NestJS 负责,Go Gateway 只做 CMPP 连接和事件回传”的边界不一致。
- 本项目需要 Redis/BullMQ 队列契约、通道级限速、业务后台路由和账务追踪,直接接入会形成业务模型耦合。
- 第一版应避免直接照搬完整开源网关,服务层按项目自研。
## 阶段 0 后续实测清单
1. 在阶段 1 工程骨架中保留 `internal/cmpp` 适配层,避免业务代码直接散落调用 gocmpp。
2. 阶段 7 实测断线重连、慢响应、窗口满、重复回执、sequence 回绕。
3. 在 Linux 部署环境执行 `go test ./...` 和本地模拟 SMSC 联调。