Files
lislgosms/docs/phase-0-open-source-evaluation.md
T

79 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 阶段 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 联调。