标准答案
- 调用链应传递绝对截止时间,剩余时间不足时停止新工作并释放资源,而不是每层重新分配同样的超时。
- 取消信号只能让可取消的工作尽快停止;已经提交的扣款、消息或数据库事务不能假设能被安全撤回。
- 重试前要判断错误是否暂时、操作是否幂等和剩余预算是否足够,并设置次数、退避和抖动。
- 任务状态要记录取消来源和最终业务结果,避免客户端看到超时就重复提交。
题目解析
超时描述的是等待预算耗尽,取消描述的是停止请求,执行中断描述的是运行时是否真的停止了工作;三者可能同时发生,也可能只有其中一个发生。面试回答要说明每种状态的事实来源。
客户端断开或超时后,服务端事务可能已经提交,外部调用也可能已经发出。对支付、发货和消息发布等不可逆动作,先查询最终状态通常比盲目重试更安全。
重试要消耗同一个绝对 deadline,并受到幂等、退避、抖动和最大次数约束。取消信号还要沿调用链传播,否则上游以为停止,后台仍会继续消耗资源。
常见误区
- 误区:所有超时都重试。改正:先判断操作是否幂等、结果是否未知和剩余预算是否足够,必要时先查询状态。
- 误区:收到取消就强行终止已提交业务。改正:取消只能停止可取消的工作,已产生的副作用需要对账、补偿或状态查询。
- 误区:每一层都设置固定 5 秒。改正:传播绝对截止时间,让重试和下游调用共享同一总预算。