客户端要求订单请求在2秒内返回。网关处理已耗时300毫秒,订单服务又耗时400毫秒,随后准备调用库存服务。为了避免下游完成时结果已对客户端无用,较合理的做法是()。
端到端预算只有2秒,已消耗700毫秒后不能让每一跳重新计时。传播Deadline或剩余时间能让下游判断工作是否仍有价值,并在预算耗尽时取消后续处理。
选项分析
错误。每跳重置超时会让端到端延迟超过用户预算。
正确。传播并扣减剩余预算,可协调下游超时、取消和资源释放。
错误。无超时请求会长期占用线程、连接和队列资源。
错误。结果已无消费者时继续昂贵计算通常会浪费资源,应根据业务语义处理取消。
本题为什么容易错
最常见误区是把“服务超时”当作彼此独立的参数。用户感受到的是整条链的总时间,不会因为调用跨了三个服务就多给三份等待。
简短答案
用户只愿等待2秒,下游服务还能各自再等2秒吗,正确答案是 B(传播原请求Deadline或剩余预算,扣除已耗时和必要安全余量后设置下游超时)。端到端预算只有2秒,已消耗700毫秒后不能让每一跳重新计时。传播Deadline或剩余时间能让下游判断工作是否仍有价值,并在预算耗尽时取消后续处理。
易混淆概念对比表
| 概念 | 本题判断 | 区别要点 | 记忆提示 |
|---|---|---|---|
| 库存服务重新获得完整2秒,与上游已耗时无关 | 本题干扰项 | 错误。每跳重置超时会让端到端延迟超过用户预算。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| 传播原请求Deadline或剩余预算,扣除已耗时和必要安全余量后设置下游超时 | 本题正确答案 | 正确。传播并扣减剩余预算,可协调下游超时、取消和资源释放。 | 看到题干核心场景时优先联想到它 |
| 所有服务都不设置超时,直到操作自然结束 | 本题干扰项 | 错误。无超时请求会长期占用线程、连接和队列资源。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| 客户端超时后,下游仍必须无限继续计算 | 本题干扰项 | 错误。结果已无消费者时继续昂贵计算通常会浪费资源,应根据业务语义处理取消。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
本题易混淆选项怎么区分
- 库存服务重新获得完整2秒,与上游已耗时无关:错误。每跳重置超时会让端到端延迟超过用户预算。
- 所有服务都不设置超时,直到操作自然结束:错误。无超时请求会长期占用线程、连接和队列资源。
- 客户端超时后,下游仍必须无限继续计算:错误。结果已无消费者时继续昂贵计算通常会浪费资源,应根据业务语义处理取消。
知识点详解
Deadline表示请求最晚仍有价值的时间点,timeout表示从当前时刻可等待的时长。跨服务调用时,应将原Deadline或扣除已耗时后的剩余预算向下游传播,并在预算不足时快速失败或降级。服务还应响应取消信号,停止不再需要的工作。预算设置需结合延迟分布、网络开销、重试和业务后果。
备考速记
整条链共用一只钟:上游花掉的时间,下游不能重新领取。
Deadline传播 在取消传播场景中的作用
本题剩余理论预算为1300毫秒。若预留200毫秒给响应返回和订单服务收尾,库存调用的实际超时上限可控制在约1100毫秒,而不是机械使用2秒。
同类题怎么考
- 计算串行调用剩余超时预算。
- 识别每一跳重新设置完整超时造成的尾延迟和资源浪费。
Deadline传播 在系统架构设计师软考中的考法
看到多层串行调用和端到端时限,先做减法。选项若让每一跳重新获得完整预算,通常会突破用户Deadline。
解题思路
直接算账:总预算2000毫秒,前两段用了700毫秒,只剩1300毫秒;还要给网络返回和上游收尾留一点余量。库存服务若再拿完整2秒,即使成功,客户端也早已放弃。B 的思路是让整条链共用一只倒计时钟。
考点定位
每一层都配置2秒并不等于端到端2秒。串行调用会累加等待,重试和排队还会继续消耗预算。
易错提醒
- 只传播超时值,不扣除排队和上游已消耗时间。
- 客户端取消后,中间服务没有把取消信号传给下游。
- 重试没有占用独立预算,一次请求在多层重复放大。
备考提示
- 画时间轴并写出总预算减去每段耗时。
- 把超时、Deadline、取消传播和重试预算放在一组复习。
你可能还想了解
- 微服务每一层都设置2秒超时有什么问题?
- Deadline和timeout有什么区别?
- 客户端取消后下游是否应该停止?
本文小结
端到端2秒预算应扣除网关和订单服务已耗时,再把剩余Deadline传播给库存服务,不能让每一跳重新获得完整2秒。