W5 Day3 · A 级(必须掌握,面试核心)· 4h · 学完能讲透"哪些错该重试、怎么退避、重试失败怎么补偿、为什么不能无限重试"
每个工具调用都要有超时时间,防止下游无响应时调用方无限等待、资源被挂死。
CompletableFuture / Future.get(timeout) 或 Resilience4j 的 TimeLimiter。超时是"下游不可靠"时的第一道保护,但必须配合"取消"和"后续决策"才有意义。除了单工具,整个 Agent 调用也要有总时长上限(deckline),防止循环 + 多工具把整体拖死(见 W5D2 时间预算,这里从"超时触发"角度再看)。
| 超时层次 | 保护对象 | 超限动作 |
|---|---|---|
| 单工具超时 | 单个下游调用 | 返回超时受控错误 → 重试/换路 |
| 整体 Agent 超时 | 整个 Loop/连接/线程 | 中断循环 → 优雅结束(PARTIAL) |
| 错误类型 | 可重试? | 原因 | 例子 |
|---|---|---|---|
| 网络超时/连接失败 | ✅ 可 | 瞬时、下游可能已恢复 | 医保接口 504、连接池耗尽 |
| 限流 429 / 503 | ✅ 可 | 稍后重试可过 | 下游限流,退避后重试 |
| 5xx 服务端错误 | ⚠️ 视情况 | 可能瞬时也可能持续 | 500 偶发可重试,持续则转人工 |
| 业务校验失败(4xx 参数错/无权限) | ❌ 不可 | 重试同样会失败,需改输入 | 保单号不存在、参数不合法 |
| 领域规则冲突 | ❌ 不可 | 数据状态问题,重试无效 | 理赔已结案不能再提交 |
重试不能"立刻连发",否则瞬时故障还没恢复又被打爆。用指数退避:每次重试间隔成倍增长,并加抖动(jitter)避免"重试风暴同步"。
for attempt in 1..MAX:
try: return invoke(tool)
except Retryable as e:
if attempt == MAX: break
delay = min(cap, base * 2**(attempt-1)) + random(0, jitter)
sleep(delay)
return compensate() # 重试耗尽 → 补偿
@Retry + waitDuration/enableExponentialBackoff 直接支持;也可自己实现。关键是"退避 + 上限 + 抖动"三件套。雪崩:下游故障 → 上游大量重试 → 下游压力更大 → 彻底崩溃 → 上游全挂。退避 + 抖动打破这个正反馈。
重试耗尽仍失败,不能"抛异常让用户懵",要做补偿(Compensation):把系统从"部分完成"拉回一致状态。
| 补偿动作 | 做法 | 适用 |
|---|---|---|
| 回滚已做部分 | 撤销本事务内已执行的副作用 | 多步写操作,前几步成功了 |
| 标记人工介入 | 留工单/告警,转人工处理 | 高风险(理赔提交失败) |
| 降级返回部分结果 | 返回 PARTIAL + 缺失说明 | 查询类,能答多少答多少 |
| 幂等去重 | 用 request_id 防重复提交 | 重试已部分成功的写操作 |
重试不是免费的——它消耗次数预算、Token 预算、时间预算。三者必须联动,否则重试会悄悄突破预算。
Temporal 是用"代码即工作流"实现可靠长流程的框架。它天然解决本节关心的三件事:
| 本节概念 | Temporal 对应 |
|---|---|
| 状态持久/可恢复 | Workflow 自动持久化每一步,崩溃后从事件重放恢复 |
| 超时/重试 | Activity 自带 ScheduleToClose / Heartbeat 超时 + RetryOptions(指数退避) |
| 补偿(saga) | 手动写补偿 Activity,或用 Temporal 的补偿模式 |
Java SDK 示例(概念级,不必背):
@WorkflowInterface
public interface ClaimWorkflow {
@WorkflowMethod
String process(String claimId);
}
@ActivityInterface
public interface ClaimActivities {
@ActivityMethod
String submitClaim(String claimId); // 失败按 RetryOptions 退避重试
}
| 记录项 | 用途 |
|---|---|
| 每次重试(次数/间隔/原因) | 看是否频繁重试、退避是否生效 |
| 超时事件 | 定位慢下游、定超时阈值 |
| 补偿触发(回滚/转人工) | 审计"为什么没办成"、复盘 |
| 熔断/限流触发 | 发现下游不健康 |
| 环节 | 设计要点 |
|---|---|
| 重试 | 只对瞬时错误重试(网络/429/偶发5xx);业务校验失败不重试,改输入或转人工;带幂等键 |
| 退避 | 指数增长 + 上限 cap + 随机抖动;分散重试波避免同步风暴 |
| 补偿 | 重试耗尽→回滚已做部分 / 标记人工介入 / 降级 PARTIAL / 幂等去重;高风险转人工留痕 |
| 配套 | 退避+限流(控流)+熔断(断流)三重保护雪崩 |