Effect 深度课effect@4.1.4 · LTS
错误与诊断

L11 恢复策略与重试边界

⏱ 30 min难度 3/5前置:L10
本课目标
  • 按场景选择恢复算子
  • 理解 retry 与 Schedule 是策略描述
前置课时尚未完成:L10

可以自行跳转学习,但按顺序推进会更省力;学情分析会把这类缺口归入「前置缺口」。

恢复算子选择表

  • catch / catchTag / catchTags:只处理 E 中的某类或全部预期错误。
  • orElse / Effect.result:提供备用计算,或把结果转成值再分支。
  • catchDefect:只在边界处理缺陷。
  • catchCause:拿到完整 Cause,做统一上报或聚合决策。
  • Effect.exit:把失败吸收成值,用于批量任务里「不因一个失败中断全部」。
重试是策略,不是循环
← 代码可左右滑动 →
import { Effect, Schedule } from "effect"

const resilient = flakyRequest.pipe(
  Effect.retry(
    Schedule.exponential("100 millis").pipe(
      Schedule.jittered,
      Schedule.compose(Schedule.recurs(4))
    )
  ),
  Effect.timeout("3 seconds")
)
💡 Schedule 本身是一份可组合的策略描述:初始延迟、退避因子、抖动、最多几次。
🔬 为什么要 jitter

固定间隔的重试会让大量客户端在同一时刻再次冲击刚恢复的下游——重试风暴。jittered 给间隔加随机扰动,把峰值摊平。Schedule 把这类经验直接做成可组合的算子。

交互演练
关键术语
Schedule
描述重复/延迟/退避策略的不可变值
jitter
给重试间隔加随机扰动以避免同步重试风暴
常见误区
× 对 defect 做 retry——bug 不会因为重试而消失,只会放大流量。
× 重试非幂等写操作,需要配合幂等键或去重。
随堂测验(即时反馈,答题计入掌握度)
Q1只想恢复 NotFound 这一种错误,用?
Q2Effect.retry 接受的是什么?