JJava 知识库
JAVA INTERVIEW

高频面试题

架构高级约 3 分钟

对接第三方服务时,对方接口突然大面积超时和报错,你们会怎么止损、降级和恢复?

参考回答约 3 分钟 · 口语表达
先说结论

我会先控制影响,再按证据定位:超时限制单次等待,重试处理短暂失败,熔断在持续失败时快速阻止调用,降级提供可接受的替代结果。正确顺序是先定义端到端预算,每跳超时小于剩余预算;只对幂等且可能恢复的错误有限重试;熔断后快速失败并进入降级。 四者必须配合隔离和限流,否则线程、连接和队列仍可能被慢依赖耗尽。

01

我会先确认影响范围,同时控制故障继续放大。通过调用预算、退避重试、熔断状态机和降级策略防止级联故障。超时限制单次等待,重试处理短暂失败,熔断在持续失败时快速阻止调用,降级提供可接受的替代结果。正确顺序是先定义端到端预算,每跳超时小于剩余预算;只对幂等且可能恢复的错误有限重试;熔断后快速失败并进入降级。 四者必须配合隔离和限流,否则线程、连接和队列仍可能被慢依赖耗尽。

02

止损之后,我会按请求链路建立证据,而不是凭经验猜。沿着「请求进入隔离舱 → 应用超时预算 → 失败触发有界重试 → 熔断并返回降级 → 半开探测后恢复」观察输入、状态与输出,这些阶段都可以从日志、指标或源码里验证。 请求进入隔离舱 线程池、连接池或信号量隔离不同依赖,避免一个故障耗尽全部执行资源。 应用超时预算 端到端超时预算要逐级递减,内部调用不能各自使用比入口更长的超时。 失败触发有界重试 重试只适合瞬时故障和幂等操作,应使用退避、抖动和重试预算防止流量放大。 Resilience4j CircuitBreaker events:状态与窗口。 调用链 retrycount:重试放大。 我会先确认请求实际走到了哪条路径,再用运行数据验证,不会只看类名或配置猜测。

03

定位时我最关注这些参数、指标和容量关系。是否理解四种手段解决不同故障阶段的问题。 能否设计端到端超时预算和有限退避重试。 是否考虑重试放大、幂等和半开探测。

04

找到根因后先做最小修复,再用同样的流量验证。每个请求串行调用下游三次重试,每次 2 秒,入口线程大量阻塞。将下游隔离、总预算 800ms、只对安全错误重试一次并设置熔断后,故障不再跨服务扩散。 每层各重试三次形成指数放大:超时与慢调用率:总预算逐级递减。 降级返回成功却写入错误业务状态:重试放大倍数:只重试幂等瞬时错误。 半开一次放全量流量:熔断状态变化:隔离池与下游容量对齐。 固定输入和基线 先在没有故障注入的环境执行上述配置,固定数据规模、并发度、运行时版本和预热时间。以「重试放大倍数」为主基线,记录值应满足「记录活动/稳态基线」;同时保存 超时与慢调用率、重试放大倍数,使后续变化能够回到同一时间轴比较。

05

恢复阶段要逐步放量,最后把监控和边界补齐。方案:更适合的场景:主要收益:代价与边界。 超时+有界重试:短暂网络抖动、操作幂等:提高瞬时成功率:放大下游压力和尾延迟。 熔断+降级:依赖持续故障:快速失败保护资源:阈值错误会误熔断。 隔离舱:多依赖/租户风险不同:限制故障范围:资源碎片与配额治理。 选型至少带上 峰值流量、数据规模、依赖容量、一致性目标和故障预算,并用上面的量化基线验证;未知数据应明确为待测假设。

排查与恢复时间线从目标到落地
01请求进入隔离舱
02应用超时预算
03失败触发有界重试
04熔断并返回降级
05半开探测后恢复