第 20 / 23 篇

附录 A:练习参考与评审问题

这些参考说明判断所需的事实与边界,不替所有业务规定唯一实现。读者应把答案连接到自己的工具合同、数据库部署和权限来源,并用实际实验验证新增保证。

A.1 身份、计划与审批

第 1 章的邮件超时只有通信失败证据。确认未发送需要发送服务的权威执行阶段或可查询记录;可能已发送时不能直接重跑整个流程;确认已发送需要与原操作对应的服务结果。通知节点应有独立身份,不要把它和之前的积分变化混作同一次副作用。

第 2 章中,同键从 500 改成 600 应被视为参数冲突。接入层返回原计划状态或明确冲突,审批层不能把旧许可迁给新参数,工具账本也不能让同键改变效果。追加 100 应是另一项业务操作,经过独立批准并与原操作关联。

第 3 章的状态与事件必须共同提交。第二连接写事件失败,不能撤销第一连接已经提交的成功状态;在同一本地事务内失败则两者共同回滚。但工具的独立事务依然可能已提交,需要原键查询补齐事实。

第 4 章应拒绝提案自带审批、租户、actor、工具地址和幂等能力。忽略未知字段会使调用方误以为这些字段生效,也容易在升级后突然扩大执行语义。兼容性需要明确版本和迁移规则,权限字段尤其不能静默接受。

第 5 章要先定义许可约束时刻。本地检查能证明调用前数据库中的审批仍有效;如果要求工具受理时仍有效,业务服务必须核验受保护的执行凭据或权威许可。长调用跨过审批截止时间,不自动等于已经完成了远程撤销。

A.2 并发、围栏与工具合同

第 6 章的 SKIP LOCKED 允许跳过已锁候选,因此不承诺严格 FIFO。一次空领取应触发有界等待或下次扫描;确认所有任务结束,需要独立的业务结束条件,而非某个 worker 一时没拿到任务。

第 7 章旧 worker 不能凭有效回执恢复本地写入资格。回执仍可作为核查材料交给当前拥有者或核查者,由其验证操作键、指纹与当前状态后条件提交。旧 fence 被拒绝不表示工具结果失效。

第 8 章必须对齐工作流恢复周期与工具键保留期。可选择更长的结果保留、独立持久业务身份、到期后只允许人工核查等合同。不能在去重记录消失后仍假设重放安全。

第 9 章查询副本暂时 404,不能证明原请求没有提交。工具支持相同键持久去重时,按原键重放可依赖其合同;缺少此能力时,通常需要等待权威查询或人工调查。查询层的延迟应与实际故障一同测试。

第 10 章可信前置拒绝耗尽预算可记录失败,因为合同说明效果未发生。第三次调用结果未知则继续核查:查到效果可记录成功,查不到且无执行预算时保留未知与人工责任。预算不能改变已经成立的业务事实。

A.3 崩溃、取消与版本

第 11 章先确认持久状态和原业务身份,等待或确认旧租约失效,进入 unknown,再权威查询工具,最后条件保存核查结果。不要手工直接改 succeeded,也不要重新规划或换键调用。租约处理的是拥有权,回执处理的是业务结果。

第 12 章原发放保持成功,取消请求作为事实保留。补偿创建新键、新计划和新审批;补偿失败时,原效果仍然存在。工具事务提交以后,本地数据库回滚和关闭网络连接都不能撤销它。

第 13 章单纯显示字段变化和额度解释变化具有不同兼容性。后者可能改变原指纹含义,应保留旧执行器或显式迁移与重新审批。未知版本被拒绝是保护,回滚代码也不意味着已经恢复对新数据版本的理解。

第 14 章总连接上限要按进程数、每进程池大小、核查并发和其他用户估算。任务排队、等待连接与等待工具是三个阶段,应分别观察。SKIP LOCKED 不提供租户配额和公平调度,新增这些能力需要独立竞争实验。

A.4 证据、首跑与上线评审

第 15 章先关联本地状态、围栏、事件与原操作键,再权威查询效果。HTTP 错误既不能证明零副作用,也不能替代工具账本;事件数量也不能直接当作业务效果数量。

第 16 章缺少真实数据库环境时,Go 测试可能跳过集成部分并返回零退出码。必须读取具体测试事件,确认应执行测试没有 skip,版本与数据源成立,证据收集器才允许标记整轮通过。

第 17 章应标出领取事务、工具事务、终态事务。两个事务之间的故障窗口不会被一个函数封装消除。调用前本地许可检查与远程受理之间,也需要工具侧合同配合。

第 18 章的一页上线评审至少包括:谁认证与授权,哪些工具可以核查,未知状态归谁处理,预算和时间边界是什么,数据恢复依据是什么,以及哪类故障尚未测试。不要把一个单实例教学内核作为生产平台完整验收。

A.5 综合项目提交材料

建议提交状态图、表结构、不可变计划格式、权限与工具合同、故障矩阵、实际运行报告及恢复操作说明。新增多节点或补偿以后,必须重新定义部分成功和恢复单位。

找一位没有参与实现的人,仅凭材料说明:某个任务当前是否允许执行,已经发生哪些效果,哪些事实还未知,下一步由谁负责。解释不清楚的地方,优先补证据和状态语义,而不是添加一个更乐观的状态名称。