Modal工程师Colin Weld和Connor Adams近日撰文,介绍了团队如何从头重建沙箱基础设施,以支持数百万个并发沙箱以及每秒数万次沙箱创建。他们指出,Kubernetes等传统容器编排系统难以在这一规模下运行,因为其高度依赖集中式协调和强一致性状态。

运行100万个沙箱需要数万个计算节点,许多操作的复杂度为O(容器数)或O(节点数),或两者兼有。以Kubernetes为例,调度算法和中央持久化存储etcd的负载都会随节点和Pod数量增长而增加,且etcd没有为在同一键空间内分片提供原生支持,在Pod创建率或更替率很高时容易成为瓶颈。团队认为,克服这一限制虽可行,但需要重写或替换etcd并对调度算法做并行化处理,工作量巨大。

Modal确立的设计原则是:所有产生O(沙箱)或O(节点)级负载的组件都必须默认支持水平扩展,沙箱创建流程应尽可能简单。其根本性改动是停止全局协调,使调度更接近负载均衡:每个工作节点各自成为“单一数据源”,不再依赖中央数据存储;调度层由一组并行运行的调度服务器组成,调度服务器决定目标节点后通过RPC直接联系该节点,节点有空闲资源则接受请求,否则拒绝。

最终架构仅剩一个瓶颈:所有工作进程将状态发布到一个Redis流中,而负载测试表明,该方案在工作进程数量远超10万时仍然可行。基准测试中,Modal在不到一分钟内创建了100万个沙箱,从启动到运行代码的中位时间不到0.5秒。亚马逊云科技首席AI工程师Alex Jones评论称,Modal的关键在于没有试图扩展Kubernetes,而是在理解其局限后绕过了整个系统,并认为这显示出协调与执行正在脱钩。