客户端已经关闭页面,后端仍在执行昂贵查询和远程调用,可能造成资源浪费。但取消请求也不等于已经提交的业务自动撤销。需要区分停止等待、停止计算和撤销业务三种含义。
沿可取消操作传递信号
入口取消信号可以传给支持取消的数据库和 HTTP 操作,减少不必要工作。不要只在控制器接收参数,后续调用却全部忽略。每一层都应知道取消是正常终止还是需要记录的异常。
提交边界之后核实业务状态
如果订单已经提交,客户端断开连接不能当成订单不存在。对于有副作用的流程,应明确取消前后的状态,必要时通过任务记录或业务查询返回结果。长时间任务可以采用受理后查询进度的方式,但仍需持久化与恢复设计。
不把取消当成绝对保证
取消通常是协作机制,具体库或远端系统未必及时响应。即使本地停止等待,远端动作仍可能完成。资源限制和超时需要配合使用,不能只加一个 Token 就认为工作一定停止。
验收断连与超时
测试客户端提前退出、依赖响应缓慢和应用停止,检查资源是否逐步释放、日志是否误报大量故障,以及已提交业务是否仍可查询。明确哪些工作必须继续完成,哪些可以放弃。
常见问题:捕获取消异常后直接返回成功可以吗?
不应默认这样做。成功必须对应已确认的业务结果,取消后的未知状态应按契约表达。
技术参考:微软:IHttpClientFactory。具体接口与配置请结合使用版本核对。
将评估落实到你的系统
如果内部团队需要把这些约定落到可运行的工程中,可以通过微服务基础架构建设沟通接口、公共能力与交接范围,先以一个业务场景验证方案。