Local review candidate only. Explicitly selected inherited prerequisites and prior repair patches; unrelated WIP and independent MQ fixes are excluded. No push or deployment authorized.
3.9 KiB
SH 流程恢复与回调轮次契约(2026-10-23)
复用既有 flow_apply_command,不新增库列或替代流程架构。FC 签名收据 + HTTP 建件仍是主链,MQ 不作为必选。
请求轮次与实际轮次
command.attempt 记录用户已授权请求的历史,不根据 duplicated 猜测,也不把远端 applyRound 写回 attempt。
FL 实际结果(branch/applyRound/status/version/instanceId)存于原 payload_json 的服务器保留节 _flOutcome,
原发起材料字段不变;再次发送反序列化 FlowOutbound 时不把该保留节送出。
service_apply.flow_result_json 的 applyRound 是已确认镜像轮次;没有字段的旧行初始按 1。
| FL 原分支 | SH 行为 |
|---|---|
| CREATED | 按真实状态/版本确认新建;不假定 START 后必然仍为 10 |
| IDEMPOTENT | 镜像真实 10/20;本地终态不凭幂等响应回开 |
| SAME_REQUEST | 同命令回读,不新建 attempt;30/40 仍为原终态。若是已重启命令的丢响应恢复,只凭同 token+匹配命令轮次修正已存在的远端轮次 |
| STALE_ROUND | 保存远端实际轮次与状态;不倒退更高的本地镜像轮次、不回开终态 |
| REPLAY_ONLY | 保留远端真实状态;网络恢复不得借此重启 |
| RESTARTED | 唯一主动进入新轮的 FL 分支;回填还必须通过轮次、token、实例与版本保护 |
| CONCURRENT_CREATED | 当作已存在实例回读,按实际状态确认,不依据本地 attempt 开新轮 |
未知/缺失 branch 不是成功,转 UNKNOWN 先查真实状态。旧 FL 响应缺 status/version 时同样查询, 查询结果必须用 instanceId 与本地命令的 applyRound/requestToken/学校/流程线交叉确认。 UNKNOWN 查询异常或证据不符继续 UNKNOWN + 退避,不能降为下一次会盲发的 FAILED;预算耗尽 DEAD。 查无才同 token 补发并置 retryOnly=true;只有用户明确重提才可以建立新的请求轮。
用户入口与并发
ServiceApplyService 在生产装配 flowCommands 时,初次代发起、retry、resubmit 全走同一命令服务; 可信 FC 办件缺命令服务直接拒绝,不能绕到旧 apply + markResubmitted 常量 10。 用户授权重提在短事务中锁办件,已有尚未落定的新轮命令时复用它,双击不再创建第三轮; 真正开始重提的命令 attempt 至少是当前镜像轮次+1。HTTP 不占办件长事务。 无 Spring 命令装配的非 FC 历史适配路径保留,不能用于可信 FC 办件。
领取短锁不覆盖 HTTP,重复请求可能并发;FL 既有 token/轮次守卫吸收重复, SH 结算时锁命令并检查轮次/版本,旧响应既不能覆盖业务终态,也不能倒写较新命令台账。
回调
FL 在同步事件发布阶段冻结 applyRound/requestToken,AFTER_COMMIT 不用重读到的新轮为旧事件贴标。 两个字段在既有回调 data 中传递,无需修改共享 SDK DTO 或数据库。 SH 必须同时匹配事件实例、学校、流程线,以及该办件对应的 command.attempt/requestToken; 命令必须已发送,若已有 FL 结果证据,其实际 applyRound 必须一致。 只有经过这些校验的更高轮次 + 更高实例版本才可以从终态回开;实例版本只承担轮内乱序判据。 旧轮即使版本很高,也不能修改新轮终态或结果;同轮终态也不被迟到 task.* 回退。 新轮快速结束的回调先到后,较旧的 apply 响应不覆盖它。 缺轮次身份的有命令回调保守忽略;真正无命令存量单只走第 1 轮兼容,绝不单凭版本回开终态。
验证边界
规则测试控制竞争时序,不声称为 MySQL 并发或 160 验收。FL 指定 11 项仍为真实 MySQL 测试; CI 只连接本次 job 的独立 schema,Hibernate 固定 validate。部署必须先 FC/FL 后 SH, 以便 SH 严格校验启用前,FL 已能发送冻结轮次身份;存量缺身份积压需单独清点,不回退新数据安全语义。