结论
缺少换货链路历史订单时,CPG 会按订单号请求 OMS 重发 9999;只有完整组装并成功发送后,才清理待补状态。1
适用于CPG 换货历史订单补数QA 测试说明
一条恢复链路如何执行?
图的结构
- message-bus
bus - Kafka
kafka - CPG
cpg - Redis
redis - OMS支持工具
oms - POSLog发送端
sender bus→kafka· 原始订单消息kafka→cpg· UUID与订单号cpg→bus· 按UUID查询详情,并递归查换货关系bus→cpg· 订单详情,或成功响应但无订单cpg→redis· 保存缺失订单号,不设过期时间cpg→oms· 创建任务:codes + operates=9999oms→cpg· code=0:任务已受理oms→kafka· 投递9999消息,UUID可能不同kafka→cpg· 消费9999并重新查询订单关系cpg→bus· 重新获取父单和全部换货子单cpg→sender· 完整组装后发送POSLogcpg→redis· 发送成功后清理本轮待补状态
测试前准备什么?
- 准备可控的测试环境,包含 message-bus、Kafka、Redis 和 OMS 支持工具。
- 准备换货父单及一层或多层换货子单,确认各订单号和换货关系。
- 确认可观察 OMS 请求的
codes、Kafka9999消息、POSLog 发送结果及 Redis 待补 key。 - 为缺失场景准备“查询成功但订单列表为空”的响应;不要用超时或鉴权失败代替缺失。
- 若要人工触发 OMS 任务,在测试环境调用
POST /poslog/retry/oms/resend,请求体为{"orderIds":["<orderId>"]}。不要对生产订单执行。
- 项目
- 当前行为
- 待补key
poslog:exchange:resend:pending:<orderId>;无 TTL- 扫描周期
- 每 1 分钟扫描待补订单
- OMS请求冷却
- 每个订单最短 5 分钟一次
- 并发处理锁
- 同一待补订单最长持有 20 分钟
- 完成后冷却
- 发送成功后 5 分钟内抑制重复 Kafka
9999
必测场景与通过条件
| 用例 | 操作 | 通过条件 |
|---|---|---|
| 非换货回归 | 投递非 9999 普通订单,且无换货关系 | 只按原 UUID 查询;无递归订单查询、无 OMS 重发,正常完成原有处理。5 |
非补数 9999 | 投递非换货订单 9999,Redis 无待补和冷却 key | 继续常规校验、生成和发送;无 OMS 自动补数任务。4 |
| 换货数据齐全 | 投递含换货关系的订单,所有父子详情均可查 | 递归组装完整,只发送一次;不创建补数任务。5 6 |
| 单个换货子单缺失 | 让子单查询返回成功空列表 | codes 只含缺失子单号;本轮不校验、不生成、不发送;待补 key 保留。11 12 |
| 多个或多层缺失 | 让多个换货节点查询成功但无订单详情 | 收集所有已发现的缺失订单号;不得以部分订单生成或发送。数据恢复后,9999 重新触发整条关系查询。6 1 |
| 查询故障 | 分别模拟无HTTP响应、非成功响应码、RPC异常 | 不把故障当作历史缺失;不因该故障创建 OMS 重发任务。13 11 |
| OMS接口响应 | 返回 code="0" 且 data=false;再测试非零 code 或请求异常 | code="0" 视为任务已受理;其他结果记失败,待补状态保留并在冷却后重试。14 9 |
| 发送失败 | 完整组装后让 POSLog 发送失败 | 不清理待补 key;后续仍可重试。发送成功后才清理并写完成冷却。2 7 |
| 重复与并发 | 待补期间并发投递同订单 9999;成功后 5 分钟内再次投递 | 同一待补订单串行处理;完成冷却期间重复消息被抑制。4 9 |
| 未发货换货单 | 测试普通未发货子单及处于待补状态的 9999 子单 | 普通未发货过滤仍生效;待补 9999 仍查询父单,以便恢复原换货组装。5 |
哪些边界需要重点观察?
| 自测项 | 结果 |
|---|---|
全项目 mvn test | 41 项通过;包含 2 项 signature-service、39 项 poslog-service 测试 |
| 换货恢复目标测试 | 10 项通过;覆盖缺失订单、Kafka中止路径、OMS任务契约 |
| 外部联调 | 未执行真实 OMS、Kafka 或 msgbus 调用;需在集成环境验证任务落地和新 UUID 消息到达 |
执行测试命令
bashmvn -pl poslog-service -am -Dtest=MessageBusMissingExchangeOrderTest,MessageBusMergeRejectTest,OmsSupportToolTaskRpcTest,KafkaMessageListenerExchangeRecoveryTest -Dsurefire.failIfNoSpecifiedTests=false testbashmvn test