Effect 深度课effect@4.1.4 · LTS
流、调度与工程化

L22 Schedule:把重试策略变成值

⏱ 30 min难度 3/5前置:L11
本课目标
  • 能组合出指数退避 + 抖动 + 次数上限
  • 知道 timeout 与重试的边界
前置课时尚未完成:L11

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

策略描述,而非控制流

Schedule 是一个不可变值:描述「第 n 次重试前等多久、最多重试几次、什么条件下继续」。Effect.repeat / Effect.retry 在运行时解释它。因为它是值,所以可以 compose、jittered、并复用到不同任务上。

组合一个生产级策略
← 代码可左右滑动 →
import { Effect, Schedule } from "effect"

const policy = Schedule.exponential("100 millis").pipe(
  Schedule.jittered,
  Schedule.compose(Schedule.recurs(4))
)

const safe = fetchUser.pipe(
  Effect.retry(policy),
  Effect.timeout("3 seconds")
)
💡 Effect.timeout 本质是 race 一个定时器并在超时后中断原 fiber,因此资源清理依然有保证。
💡 顺序很重要

先 retry 再 timeout 表示总时长受限;反过来则每次尝试各自限时。写策略时先画出「时间预算」再决定算子顺序。

交互演练
关键术语
Schedule
可组合的重复/退避策略值
timeout
基于竞速与中断的时间预算
常见误区
× 重试非幂等操作而不做去重,导致重复扣款/重复写入。
随堂测验(即时反馈,答题计入掌握度)
Q1Schedule.jittered 解决什么问题?
Q2Effect.timeout 的实现基础是?