fix: implement channel group routing failover

This commit is contained in:
hectorzhao
2026-07-03 11:07:43 +08:00
parent 131f344ac4
commit a890b03163
16 changed files with 853 additions and 121 deletions
+146 -5
View File
@@ -664,12 +664,139 @@
### TC-SEND-003 通道路由和 Gateway SubmitCommand
- 优先级:P0
- 前置条件:存在 active 通道和路由规则
- 前置条件:企业应用已绑定对应运营商的 active 通道组,通道组内存在 active 且 online 的通道
- 步骤:处理一条发送 job。
- 预期结果:
- 选择正确通道。
- 先按号码前缀正则识别运营商,再只在企业应用绑定的对应运营商通道组内选择正确通道。
- 创建 SmsSubmitRecord。
- 投递 Gateway SubmitCommand,包含 traceId、messageId、channelId、submitId、phoneNumber、content、cmpp 参数。
- 未配置对应运营商通道组或未命中可用通道时不发送,并记录可读失败原因。
### TC-SEND-010 禁止路由规则直接绑定单通道
- 优先级:P0
- 前置条件:存在通道 A、通道组 G、企业应用 App。
- 步骤:
1. 尝试创建或启用直接绑定通道 A 的路由规则。
2. 创建 App 的发送任务。
3. 查看 submit record、trace 和系统日志。
- 预期结果:
- 系统不允许直接绑定单个通道作为发送规则。
- 发送链路只接受通道组路由。
- 如存在历史单通道规则,发送链路不得使用该规则,并记录配置错误。
### TC-SEND-011 未命中企业应用通道组时不发送
- 优先级:P0
- 前置条件:企业应用 App 未配置通道组,系统存在其他 active 通道。
- 步骤:
1. 创建 App 的发送任务。
2. 触发送 worker。
3. 查看发送明细、submit record、trace 和系统日志。
- 预期结果:
- 系统不 fallback 到其他 active 通道。
- 不投递 Gateway SubmitCommand。
- 发送明细进入 failed。
- 运营端 trace 和系统日志可看到“未配置可用通道组”原因;客户端本期只展示失败状态,不展示通道细节。
### TC-SEND-012 手机号段识别归属地参与路由
- 优先级:P0
- 前置条件:运营商区分规则可识别移动号码;手机号段库存在 `prefix/province/city` 数据;企业应用绑定移动通道组,组内配置山东省网通道 A、全国通道 B。
- 步骤:
1. 使用山东手机号创建发送任务。
2. 触发送 worker。
3. 查询 submit record、trace 和路由日志。
- 预期结果:
- 系统按可配置前缀正则识别运营商,并按手机号段库查询省份和城市。
- trace 记录识别出的运营商、省份和城市。
- 路由优先选择山东省网通道 A。
- Gateway SubmitCommand 的 channelId 为 A。
### TC-SEND-013 省网未匹配时走全国路由
- 优先级:P0
- 前置条件:手机号段库可识别四川手机号;企业应用绑定对应运营商通道组,组内无四川省网通道,但存在全国通道 B。
- 步骤:
1. 使用四川手机号创建发送任务。
2. 触发送 worker。
3. 查询 submit record 和 trace。
- 预期结果:
- 系统识别手机号归属地为四川。
- 省网未匹配时选择同一通道组内全国通道 B。
- 不选择其他通道组或全局 active 通道。
### TC-SEND-014 省网失败后补发全国通道
- 优先级:P0
- 前置条件:通道组内配置山东省网通道 A 和全国通道 B/C;A、B、C 均属同一企业应用授权通道组;A 可模拟 submit 失败、连接断开或最终回执失败。
- 步骤:
1. 使用山东手机号创建发送任务。
2. 首次路由命中 A。
3. 模拟 A submit rejected、submit timeout、连接断开、运营商失败回执或其他 receipt failed。
4. 查看补发记录、submit record、trace、计费流水。
- 预期结果:
- 系统立即切换到全国通道 B 补发,不再尝试同省第二省网通道。
- 如果 B 失败,继续按全国通道优先级补发到 C。
- 补发不跨出企业应用授权通道组。
- 原失败原因、补发次数、前后 channelId 和状态流转在 trace 中可查。
- 最终成功只按企业应用客户费率扣一次,不按通道成本价重复扣费。
### TC-SEND-015 企业应用通道组保存校验
- 优先级:P0
- 前置条件:存在移动、联通、电信通道组。
- 步骤:
1. 新建或编辑企业应用,不选择任何通道组并保存。
2. 选择移动通道组后保存。
3. 再补充联通、电信通道组保存。
- 预期结果:
- 不选择任何通道组时页面不可保存,并提示至少配置一个运营商通道组。
- 允许只配置移动、联通或电信中的一类或两类。
- 已配置的运营商通道组会影响对应运营商短信分流。
### TC-SEND-016 运营商正则分流和识别失败默认移动
- 优先级:P0
- 前置条件:手机号段库的“运营商区分规则”已配置移动、联通、电信号码前缀正则;企业应用分别绑定移动、联通、电信通道组。
- 步骤:
1. 分别提交移动、联通、电信号码。
2. 提交一个正则无法识别运营商但号码格式合法的号码。
3. 查询 submit record 和 trace。
- 预期结果:
- 移动号码进入移动通道组。
- 联通号码进入联通通道组。
- 电信号码进入电信通道组。
- 运营商识别失败时进入移动通道组。
### TC-SEND-017 三网通道作为运营商通配
- 优先级:P0
- 前置条件:企业应用绑定移动通道组;移动通道组内无可用移动全国通道,但有可用三网全国通道。
- 步骤:
1. 提交移动号码。
2. 触发送 worker。
3. 查询 submit record 和 trace。
- 预期结果:
- 三网通道可作为移动、联通、电信的通配通道参与路由。
- route/trace 标明实际命中的三网通道。
### TC-SEND-018 失败补发停止条件
- 优先级:P0
- 前置条件:通道组开启失败补发并配置补发时间上限;全国通道可连续模拟失败。
- 步骤:
1. 模拟普通 failed 回执,确认触发补发。
2. 模拟 unknown 状态,执行 72 小时超时补偿。
3. 将消息提交时间调整为超过 72 小时。
4. 将消息提交时间调整为超过通道组补发时间上限。
5. 关闭通道组失败补发后再次模拟 failed。
- 预期结果:
- 普通 failed 在限制内触发补发。
- unknown 不触发补发。
- 超过 72 小时不触发补发。
- 超过通道组补发时间上限不触发补发。
- 通道组关闭失败补发时不触发补发。
### TC-SEND-004 SubmitResult accepted
@@ -2084,7 +2211,7 @@
- 前置条件:通道组包含主通道 A 和备用通道 B,A active 但连接离线,B active 且 online,签名在 B 报备通过。
- 步骤:
1. 确认 A 业务状态 active、连接状态 disconnected。
2. 确认 B 业务状态 active、连接状态 online。
2. 确认 B 业务状态 active、连接状态 online、currentConnections 大于 0
3. 创建发送任务。
4. 查询 submit record 和 trace。
- 预期结果:
@@ -2103,8 +2230,8 @@
3. 查看任务状态、发送明细、系统日志。
- 预期结果:
- 系统不向离线连接 submit。
- 按设计进入 delayed/retry、failed 或 pending_channel 状态
- 客户端和运营端展示“无可用在线通道”原因
- 发送明细进入 failed
- 运营端 trace 和系统日志展示“无可用在线通道”原因;客户端本期只展示失败状态,不展示通道细节
- 不产生 submit accepted 记录,不错误扣费。
### TC-CMPP-STATUS-008 连接状态与通道启停状态组合
@@ -2122,6 +2249,20 @@
- 启用后如连接仍 online,可恢复路由;如连接已断开,需要等待重连。
- 系统日志记录启停操作。
### TC-CMPP-STATUS-008A 通道连接可用性标准
- 优先级:P0
- 前置条件:同一通道组内准备多个通道,分别设置为 online/currentConnections=1、online/currentConnections=0、auth_failed、heartbeat_timeout、reconnecting、disconnected。
- 步骤:
1. 创建发送任务。
2. 触发送 worker。
3. 查询 submit record、trace 和连接状态日志。
- 预期结果:
- 只有业务 active、连接 online、currentConnections 大于 0 且心跳未失败的通道可被选中。
- auth_failed、heartbeat_timeout、reconnecting、disconnected 和 currentConnections=0 的通道均被跳过。
- 多连接通道只要至少 1 条连接 online 且可用即可参与路由。
- 心跳连续 3 次失败后进入重连,重连成功前不可发送。
### TC-CMPP-STATUS-009 慢响应导致窗口占满和状态告警
- 优先级:P1