一项能力能否长期维护,不取决于演示是否成功,而取决于团队能否解释每个状态、每次重试和每一份残留数据。 用户点取消后本地应立即停止安排新工作,不必等待网络往返;远端 cancel 是幂等控制消息,迟到完成由同一状态机仲裁。
产品闭环要覆盖开始、等待、取消、失败、恢复与再次进入,并保证自动化服从用户最后一次明确选择。指标应衡量任务结果,而不是按钮点击数量。
设计时必须回答的问题
先把下面几项写成可评审的规则,而不是散落在回调和界面判断里。规则越清楚,后续扩容、兼容和排错越少靠猜。
- 界面立刻进入 cancelling/cancelled 并禁用重复动作,控制通道优先发送 cancel;超时后显示“本地已停止,远端状态未知”,断点由用户选择保留。
- 为状态写出唯一所有者、版本号和终态;任何回调只能修改自己创建的版本。
- 上线参数必须有保守默认值、服务端上限和灰度开关,不能把浏览器传来的数字直接当作资源预算。
“取消按钮的真实语义:立即响应、远端收敛和残留数据选择”的交付标准是正常路径可用、异常路径收敛、资源有界,并且用户能理解系统为何采用当前状态。 这样得到的不是演示代码,而是能解释、能降级、能回滚的生产能力。
边界情况不是附加项
生产问题往往发生在两个正确动作同时到达时。需要逐条检查迟到消息、重复执行、资源耗尽和版本交叉,而不是只补当前堆栈显示的那一行。
- 取消排在大文件同一有序队列后会过很久才到;直接删除接收端数据又破坏用户期待的稍后续传。
- 只修正界面状态而没有清理底层资源,下一次操作继承队列、锁或过期凭据并再次失败。
- 没有背压或配额时,慢消费者会把内存、队列长度与尾延迟一起推高,最后拖累无关用户。
用证据确认它真的可用
测试不能以“最后成功了”结束。还要测量经历了多少次副作用、等待多久、是否泄露内容,以及失败后再次执行能否从干净基线开始。
- 在每个阶段让双方同时取消、完成和断网,测本地响应、远端收敛、资源基线、断点策略及重复 cancel 的幂等性。
- 在操作中途断网、切换网络并恢复,核对两端状态、持久化记录和资源计数最终一致。
- 用故障注入验证告警先于用户投诉触发,并确认值班人员能从有限证据定位到具体阶段。
完成并不等于主路径跑通,而是每个终态都能对账、每个自动动作都受用户意图约束、每个成本都有明确上限。