分布式系统(E04):Lambda 与 SkyPilot 的执行和调度边界
AWS Lambda和SkyPilot都能“把任务放到云上跑”,但它们调度的单位不同。Lambda围绕一次函数调用管理执行环境、扩缩容和事件重试;SkyPilot围绕带资源需求的批任务或服务,在多个云和区域间选择资源并管理集群生命周期。前者隐藏机器,后者显式优化机器放置。两者都不是共识协议,也都不会自动使外部副作用恰好一次。
分布式系统(E03):IPFS、SUNDR 与 Bitcoin 的开放网络信任模型四个问题决定执行形态
选择云执行方式前,需要把工作拆成四项:任务粒度、启动成本、失败后的重放边界、目标函数。短小无状态事件适合按调用扩展;需要GPU、长时训练、特定区域或跨云价格比较的作业更像资源放置问题。
flowchart TD
J[工作负载] --> G{调度单位}
G -->|单次事件/函数| L[Lambda式执行]
G -->|任务+资源集合| S[SkyPilot式放置]
L --> R[初始化、调用、重试]
S --> P[选云、建集群、运行、恢复]
R --> E[外部效果仍需幂等]
P --> C[checkpoint与数据位置仍需设计]
Lambda:隔离了环境,没有消除状态
Lambda执行环境经历Init、Invoke和Shutdown等阶段。平台可能复用已有环境,也可能创建新环境;初始化代码因此既不能假定每次都执行,也不能假定只执行一次。所谓冷启动是创建和初始化路径的额外工作,其大小受runtime、包体、网络初始化和配置影响,不能用一个固定毫秒数概括。
异步调用和部分事件源在失败时会重试。即使平台内部只保存一条事件,函数体仍可能执行多次;客户端超时或运行时错误也会留下结果未知窗口。
sequenceDiagram
participant E as Event Source
participant L as Lambda Runtime
participant X as External System
E->>L: event id=42
L->>X: charge(42)
X-->>L: success
Note over L: 返回前失败
E->>L: retry id=42
L->>X: charge(42) again
修复位置在副作用边界:以稳定事件ID做条件写或去重,把业务状态和处理记录放进同一事务,或者调用支持幂等键的外部API。仅提高函数超时或重试次数不能建立exactly-once。
SkyPilot:优化放置,不替应用保存进度
SkyPilot把任务、资源需求和候选云交给优化器,再由控制器创建集群、提交作业和执行恢复策略。候选的价格、容量、区域和加速器可用性会改变决策。目标是成本时,可能选择启动较慢但便宜的资源;目标是完成时间,则可能支付更高单价换并行度。
flowchart LR
T[Task + Resources] --> O[Optimizer]
O --> A[Cloud A报价/容量]
O --> B[Cloud B报价/容量]
O --> D[选择计划]
D --> V[Provision VM/cluster]
V --> X[Run]
X -->|失败| R[Restart/Recover]
R --> K{有checkpoint?}
K -->|有| P[从进度继续]
K -->|无| F[重放任务]
auto-recovery解决“在哪里重新启动”,不自动知道应用状态能否安全重放。训练任务需要checkpoint和对象存储,批处理输出需要原子发布或幂等命名,外部API仍需请求身份。spot实例回收、控制器崩溃和云API限流也属于不同故障面。
同一负载的合成对照
| 维度 | 函数式执行 | VM/集群任务调度 |
|---|---|---|
| 调度单位 | event/invocation | task + resources |
| 启动成本 | execution environment初始化 | VM或集群provision |
| 扩展方式 | 平台按调用并发 | 调度器选择实例与数量 |
| 恢复起点 | 事件重试/来源位点 | checkpoint或整任务重放 |
| 费用模型 | 调用与资源时长等维度 | 实例时长、存储、网络等维度 |
| 外部副作用 | 可能重复 | 重启也可能重复 |
本地模型使用四个任务和两个虚构云。所有时间与费用都是无量纲合成值,不对应AWS或任何供应商。函数场景把一个任务重试一次,五次函数体执行只对应四个逻辑任务。VM场景中便宜单并发方案成本更低,双并发方案完成更快,两个目标选择不同。
这类小模型的价值是暴露目标函数和重复执行,不是预测真实账单。真实比较还需固定区域、实例、镜像、数据传输、缓存状态、试验次数和价格快照。
安全性、活性与故障恢复
调度安全性可以包括“任务只使用声明资源”“同一资源不被不兼容任务同时占用”;业务安全性则是输出不重复、不越权且满足应用不变量。它们不是同一性质。控制器选到一台机器也不表示应用提交成功。
活性依赖云API、配额、容量、镜像和数据源最终可用。无容量或凭证失效时,优化器不能凭算法创造资源。跨云重试还可能遇到数据重传成本与法规边界。
运行合成实验
1 | |
完整结果见观察结果,来源见实验证据,限制见验证说明。实验不访问云API,不生成真实价格、冷启动或性能结论。
两个推演练习
函数只写一次数据库,却被平台重试,为什么仍会重复扣款?
“一次”描述一次attempt。第一次可能已经提交数据库,只是响应丢失;第二次会再次执行。稳定事件ID和原子去重记录才能把两个attempt绑定到一个逻辑操作。
SkyPilot选择了最便宜的实例,为什么最终账单仍可能更高?
单位价格不是总成本。启动等待、运行时间、失败重放、跨区传输和闲置并行度都会改变总量,优化输入过期也会改变决策质量。
E05比较三类共识研究:把网络排序下沉以追求微秒级路径、用同步轮次简化区块链共识,以及在异步拜占庭模型中用随机性换活性。
参考资料
- AWS Lambda Developer Guide,Execution environment lifecycle。
- AWS Lambda Developer Guide,Asynchronous invocation retries。
- Yang 等,2023,SkyPilot: An Intercloud Broker for Sky Computing。
- SkyPilot Documentation。

