# 第29天:Step Functions——编排复杂的业务流程 ## 今天你将学到什么 今天学习 Step Functions——AWS 的工作流编排服务。当你的业务逻辑涉及多个步骤、需要处理分支和错误时,Step Functions 帮你把这些步骤组织成一个可视化的流程图。 --- ## 为什么需要工作流编排 ### 场景:电商订单处理 用户下单后,需要执行一系列步骤: ``` 1. 验证库存是否充足 2. 扣减库存 3. 创建支付订单 4. 等待用户支付(可能要等几分钟到几小时) 5. 支付成功 → 通知仓库发货 支付失败 → 恢复库存 6. 发货后更新订单状态 7. 发送物流通知给用户 ``` ### 用 Lambda 硬编码的问题 如果把这些逻辑全写在一个 Lambda 里: - 代码又长又复杂,难以维护 - Lambda 最长只能运行 15 分钟(等待支付可能超时) - 某一步失败了,重试逻辑很难写 - 看不到流程执行到哪一步了 ### Step Functions 的解决方案 把每一步拆成独立的 Lambda 函数,用 Step Functions 编排它们: ``` 开始 → 验证库存 → 扣减库存 → 创建支付 → 等待支付 ↓ ┌─── 支付成功 ───┐ ↓ ↓ 恢复库存 通知发货 ↓ ↓ 订单取消 发送通知 ↓ ↓ 结束 结束 ``` 每一步清晰可见,错误处理和重试由 Step Functions 自动管理。 --- ## Step Functions 的核心概念 ### 状态机(State Machine) Step Functions 的工作流叫"状态机"。它定义了一系列"状态"(步骤)以及状态之间的转换关系。 **类比**:状态机就像一个流程图。每个方框是一个步骤,箭头表示下一步去哪里。 ### 状态类型 | 状态类型 | 作用 | 举例 | |----------|------|------| | Task | 执行一个任务 | 调用 Lambda、发送 SQS 消息 | | Choice | 条件分支 | 如果库存 > 0 走 A 路径,否则走 B 路径 | | Wait | 等待一段时间 | 等待 30 秒后继续 | | Parallel | 并行执行多个分支 | 同时发邮件和发短信 | | Map | 对列表中每个元素执行操作 | 对订单中的每件商品检查库存 | | Pass | 传递数据(不做操作) | 转换数据格式 | | Succeed | 标记成功结束 | 流程正常完成 | | Fail | 标记失败结束 | 流程异常终止 | --- ## 实际应用场景 ### 场景一:用户注册流程 ``` 开始 ↓ 验证邮箱格式(Task) ↓ 检查邮箱是否已注册(Task) ↓ 邮箱已注册?(Choice) ├── 是 → 返回错误"邮箱已存在"(Fail) └── 否 ↓ 创建用户账号(Task) ↓ 并行执行(Parallel): ├── 发送欢迎邮件(Task) ├── 赠送新人优惠券(Task) └── 初始化用户偏好设置(Task) ↓ 注册完成(Succeed) ``` ### 场景二:视频处理流水线 用户上传一个视频后: ``` 开始 ↓ 获取视频元信息(Task) ↓ 并行处理(Parallel): ├── 转码为 1080p(Task) ├── 转码为 720p(Task) ├── 转码为 480p(Task) └── 生成缩略图(Task) ↓ 所有转码完成 ↓ 更新数据库(Task) ↓ 通知用户"视频处理完成"(Task) ↓ 结束 ``` ### 场景三:审批流程 ``` 员工提交报销申请 ↓ 金额 > 5000?(Choice) ├── 是 → 需要总监审批(Task + Wait) │ ↓ │ 审批结果?(Choice) │ ├── 通过 → 财务打款 │ └── 拒绝 → 通知员工 └── 否 → 经理审批(Task + Wait) ↓ 审批结果?(Choice) ├── 通过 → 财务打款 └── 拒绝 → 通知员工 ``` --- ## Step Functions 的优势 ### 1. 可视化 在 AWS 控制台可以看到流程图,实时显示每一步的执行状态(绿色=成功,红色=失败,蓝色=执行中)。 ### 2. 内置错误处理 不需要自己写 try-catch。Step Functions 支持: - **重试(Retry)**:某一步失败了,自动重试 3 次,每次间隔递增 - **捕获(Catch)**:重试都失败了,走备用路径(比如通知人工处理) ### 3. 长时间运行 Step Functions 的工作流可以运行长达一年。适合需要等待人工审批、等待外部事件的场景。 ### 4. 审计追踪 每次执行的每一步都有详细记录:输入、输出、耗时、错误信息。方便排查问题。 --- ## Step Functions vs 直接用代码编排 | | Step Functions | 代码编排 | |--|---------------|----------| | 可视化 | 有流程图 | 看代码 | | 错误处理 | 声明式配置 | 手写 try-catch | | 长时间等待 | 原生支持 | 需要额外机制 | | 并行执行 | 声明式 | 手动管理线程/Promise | | 执行历史 | 自动记录 | 需要自己记日志 | | 适合 | 多步骤、有分支、需要等待 | 简单线性流程 | **建议**:如果你的流程超过 3 步、有条件分支、或需要等待外部事件,考虑用 Step Functions。 --- ## EventBridge——事件驱动架构 和 Step Functions 经常配合使用的还有 EventBridge(事件总线)。 ### 什么是事件驱动 传统方式:服务 A 完成工作后,主动调用服务 B、服务 C、服务 D。 事件驱动:服务 A 完成工作后,发布一个"事件"。对这个事件感兴趣的服务自己来响应。 ``` 传统方式: 订单服务 → 调用库存服务 → 调用通知服务 → 调用积分服务 (订单服务需要知道所有下游服务) 事件驱动: 订单服务 → 发布"订单创建"事件到 EventBridge EventBridge → 库存服务(自动触发) → 通知服务(自动触发) → 积分服务(自动触发) (订单服务不需要知道谁在监听) ``` ### EventBridge 的能力 - 接收来自 AWS 服务的事件(EC2 状态变化、S3 文件上传等) - 接收来自你自己应用的自定义事件 - 根据规则把事件路由到不同的目标(Lambda、SQS、Step Functions 等) - 支持定时触发(类似 cron) --- ## 今天的小测验 1. Step Functions 解决了什么问题?什么场景适合用它? 2. Step Functions 中的 Choice 状态和 Parallel 状态分别做什么? 3. Step Functions 的错误处理机制(Retry 和 Catch)有什么好处? 4. 事件驱动架构和传统的直接调用有什么区别? --- ## 延伸阅读 - [Step Functions 开发者指南](https://docs.aws.amazon.com/step-functions/latest/dg/) - [EventBridge 用户指南](https://docs.aws.amazon.com/eventbridge/latest/userguide/) - [Step Functions 工作流示例](https://docs.aws.amazon.com/step-functions/latest/dg/create-sample-projects.html) --- ## 明天预告 明天学习 API Gateway——如何为你的后端服务创建统一的 API 入口,管理 API 的版本、认证、限流和监控。