H3.13.4side-effect disclosure in partial failure设计

处置策略需要明确失败项是否已产生副作用

别名: 副作用披露 · unknown side effect · 失败是否已生效

概念解释

一项标着失败,并不自动等于什么都没发生。钱可能已划、信可能已进队列、编号可能已占用,只是回包没到或后续步骤炸了。说清失败项有没有副作用,人才能选择查询、等待、补发还是改参数。不说这一点,失败会被当成「可以安全再点」。这条管副作用的披露,不管状态列表和重试按钮怎么摆。

机制

失败是观察结果,副作用是世界里已经写下的记录。两者在超时、队列、跨服务调用时会分叉。恢复分支完全取决于分叉落在哪:无副作用则可以改完再提交;有副作用则禁止同样的提交,改为对账;未知则先查。披露把分叉说成人能用的句子:「这条没发出去」「这条可能已扣款,请先查看」「这条已创建但未通知对方」。缺这句时,默认脚本是再试,非幂等路径上第二次副作用就发生在「失败」之后。

边界

安全不能描述副作用细节时,仍可分成无 / 有 / 未知三档,并给出对应动作(再试 / 查看 / 求助)。有些副作用几秒后才会出现(异步队列),当下标未知比假装「无」更诚实,并约定何时变为已知。成功项默认有副作用,不必每条再声明;声明的对象是失败与未知项。

怎么落地

  • 为每类失败准备副作用档位:确定未发生、确定已发生、未知。档位决定按钮是重试、查看还是两者都有且默认查看。
  • 未知项的文案禁止「失败,请重试」作为唯一句;必须出现「可能已完成」。
  • 对账入口带着该项的幂等键或业务编号,避免人用肉眼在列表里猜。
  • 验证:对「实际已扣款但前端失败」的项走恢复。若人的第一步是再付而不是查看,副作用就没有被说清。

延伸

  • 同组H3.13.1 批量操作中部分失败需要逐项标明成功与失败状态 · H3.13.2 失败项需提供单独重试的入口而非要求整体重来 · H3.13.3 部分成功的结果不应被汇总为笼统的失败提示
  • 相邻H3.10 重试策略 · H7.13 支付失败与状态未知 · H3.02 错误消息的三要素
  • 站内检索side effect · timeout is not failure · partial failure

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/H3.13.4