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
2
3
4
5
mkdir -p examples/distributed-systems/.build/e04/tmp
export TMPDIR="$PWD/examples/distributed-systems/.build/e04/tmp"
export TMP="$TMPDIR" TEMP="$TMPDIR" PYTHONDONTWRITEBYTECODE=1
python3 -B examples/distributed-systems/cloud-e04/check.py \
--output examples/distributed-systems/.build/e04/observations.json

完整结果见观察结果,来源见实验证据,限制见验证说明。实验不访问云API,不生成真实价格、冷启动或性能结论。

两个推演练习

函数只写一次数据库,却被平台重试,为什么仍会重复扣款?

“一次”描述一次attempt。第一次可能已经提交数据库,只是响应丢失;第二次会再次执行。稳定事件ID和原子去重记录才能把两个attempt绑定到一个逻辑操作。

SkyPilot选择了最便宜的实例,为什么最终账单仍可能更高?

单位价格不是总成本。启动等待、运行时间、失败重放、跨区传输和闲置并行度都会改变总量,优化输入过期也会改变决策质量。

E05比较三类共识研究:把网络排序下沉以追求微秒级路径、用同步轮次简化区块链共识,以及在异步拜占庭模型中用随机性换活性。

参考资料