多步骤、有分支、要重试、要可视化——这就是 Step Functions 的甜区。也是 DEA 必考。
japanese-climb 的转写管道:(1) 下载 YouTube 音频 → (2) 调 Whisper 转写 → (3) 清洗字幕(去广告/语气词)→ (4) 写 S3 + 更新 DynamoDB。每步都可能失败需要重试;第 2 步偶尔卡 5 分钟;偶尔 Whisper 报"not Japanese"需要走人工审核分支。最合适的编排服务?
🎣 钩子:明明 4 个 Lambda 一个调一个就完了,为啥要引入 Step Functions?
👶 深入浅出 :
Retry: [{ErrorEquals:["States.TaskFailed"], MaxAttempts:3, BackoffRate:2}]——不用写代码。.waitForTaskToken 模式挂起等人工审核回调。Standard 最长 1 年,按 state transition 计费($0.025/1000)——你这场景一次执行 4-5 个 transition,极便宜。
SendTaskSuccess/SendTaskFailure 唤醒对应代码:src/jclimb/transcript.py + src/jclimb/youtube_collector.py
当前实现:Python 函数链式调,失败 raise 中断。重跑要手动看日志、手动跳过已完成步骤。
搬 AWS:Step Functions Standard 状态机:
{
"Comment": "japanese-climb transcript pipeline",
"StartAt": "DownloadAudio",
"States": {
"DownloadAudio": {
"Type": "Task",
"Resource": "arn:aws:lambda:...:youtube-download",
"Retry": [{"ErrorEquals":["States.TaskFailed"], "MaxAttempts":3, "BackoffRate":2}],
"Next": "CallWhisper"
},
"CallWhisper": {
"Type": "Task",
"Resource": "arn:aws:lambda:...:whisper-transcribe",
"Retry": [...],
"Catch": [{"ErrorEquals":["States.ALL"], "Next":"HumanReview"}],
"Next": "DetectLanguage"
},
"DetectLanguage": {
"Type": "Choice",
"Choices":[{"Variable":"$.lang", "StringEquals":"ja", "Next":"Cleanup"}],
"Default": "HumanReview"
},
"Cleanup": { "Type":"Task", ..., "Next":"StoreFinal" },
"HumanReview": { "Type":"Task", "Resource":"arn:aws:states:::sns:publish.waitForTaskToken", ... },
"StoreFinal": { "Type":"Task", "Resource":"arn:aws:states:::aws-sdk:s3:putObject", "End":true }
}
}
整条管道在控制台可视化:红线 = 失败点一眼可见。HumanReview 用 .waitForTaskToken — Lambda 发邮件附带 task token,审核者点链接回调 SendTaskSuccess 才继续。
SendTaskSuccess 或 SendTaskFailure 唤醒。常配 SNS(人工审核)/SQS(外部系统)。arn:aws:states:::aws-sdk:dynamodb:putItem 这类 ARN 直接调用。免 Lambda 调用费 + 免冷启动 + 更快。Step Functions 集成模式总共三种:Request Response、Run a Job (.sync)、Wait for Callback (.waitForTaskToken)。变体 1:你想把 100 万条 S3 文件并行用 Lambda 处理(每个 Lambda < 1 分钟),用 Step Functions。最合适?
✅ C:Distributed Map 专为大批量并行设计,并发上万,自动分批(child workflows),适合 S3 manifest / list 大文件场景。Inline Map 顶多 40 并发。Parallel 不是数组迭代器(A 也不可能手列百万分支)。EventBridge fan-out 不能聚合 100 万个结果回主流程。
变体 2:Step Functions Standard 工作流跑到一半发现某 Lambda 间歇性 502。想 30 秒后重试,重试 3 次,每次间隔翻倍。怎么配?
✅ B:声明式 Retry 是 Step Functions 的核心卖点之一。BackoffRate=2 表示间隔指数翻倍(30→60→120 秒)。这正是为什么选 Step Functions 而不是自己写——状态机帮你管重试逻辑。A 是反模式(Lambda 内重试占用 Lambda 计费时间)。