miller
发布于

serverless 冷启动 核心技术Isolates

原文地址 blog.cloudflare.com

云计算的未来_Isolate 框架的 Cloudflare Workers 云计算平台,无服务器编写代码
typescript 或者 Go 或 Rust 等 WebAssembly 语言编写代码。

Cloudflare 有一个名为 Workers 的云计算平台。**与我所知的其他所有云计算平台不同,它不使用容器或虚拟机。**我们认为这是无服务器和云计算的未来,接下来我会告诉你为什么。

Isolates

两年前我们遇到了这样一个问题,我们在内部可以构建的功能和选项有限,我们需要一种可以让客户自己构建的方法。因此我们开始寻找一种让用户在我们遍布世界各地的服务器上编写代码的方法(当时我们有一百多个数据中心,在写这篇文章时有 155 个)。我们的系统需要以较低的开销,安全地运行不受信任的代码。我们面对着一千万个站点,每秒处理数百万个请求,且必须非常快速地完成。

我们之前用过的 Lua 并非在沙盒之中运行, 没有我们的监督,客户无法编写自己的代码。而像 Kubernetes 这样的传统虚拟化和容器技术对于用户来说又是非常昂贵的。在一个位置运行数千个 Kubernetes pod 已经需要消耗大量资源,在 155 个位置执行它则会更糟糕。如果对他们进行规模化管理会更简单一些,但这仍然不是一件简单的小事。

我们最终决定采用谷歌 Chrome 团队开发的 V8:Isolates(孤立点集)技术,这项技术是用于他们浏览器中为 Javascript 引擎提供动力的。

Isolates 是一种轻量级框架,它使用可修改的代码对变量进行分组。最重要的是,单个进程可以运行数百或数千个 Isolate,并在它们之间无缝切换。它们可以在单个操作系统进程中运行来自许多不同用户的不受信任的代码。这样设计的目的在于可以以很快的速度启动(一些 Isolate 必须在您的 Web 浏览器中启动,仅为帮您加载该网页),并且禁止任何一个 Isolate 访问其他 Isolate 的内存。

我们只需支付一次 Javascript 运行时的开销,就几乎可以不用再额外支付其他开销运行无数脚本。任何一个 Isolate 的启动速度都比我在机器上启动 Node 的速度快约一百倍。更重要的是,它们消耗的内存比运行 Node 要少一个数量级。

Isolate 拥有人性化的 FaaS(功能服务化)人体工程学,只需编写代码而不用担心它是如何运行或扩展的。同时,它们不需要用到虚拟机或容器, 这意味着代码的运行环境实际上比我所知道的任何其他形式的云计算_更接近_裸机。我认为这种模型的经济性几乎可以达到裸机上运行代码的经济性,甚至是在一个无服务器的环境中。

不是有意给 Workers 打广告,我只是想用一个图标来向您展示差异是多么明显,以及为什么我认为这不是迭代改进而是实在的范式转变:

这些数据反映了从部署所有功能的数据中心发出的实际请求(包括网络延迟),运行 CPU 密集型工作的负载。资源

冷启动

并非所有人都完全理解像 Lambda 这样的传统无服务器平台是如何工作的。它为您的代码启动容器化进程。它运行代码的环境并不比您自己的计算机上运行 Node 更轻松,它做的是自动扩展这些过程(有点笨拙)。而自动扩展需要进行冷启动。

当你在计算机上启动代码的新副本,则会出现冷启动。在 Lambda 环境中,这相当于一个新的容器化进程,可能需要 500 毫秒到 10 秒。您收到的任何请求最多被搁置十秒钟,十秒钟已经属于非常糟糕的用户体验。由于 Lambda 一次只能处理一个请求,因此每次获得额外的并发请求时,必须冷启动一个新的 Lambda。这意味着可能会反复出现请求延迟。如果您的 Lambda 没有及时收到请求,它将被关闭,并且一切都再次重新启动。每当您部署新代码时,这种情况都会再次发生,因为每个 Lambda 都必须重新部署。由此可见无服务器并不像它被吹捧的那样好。

因为 Workers 不必开始一个过程,所以 Isolates 启动仅需 5 毫秒,这中间的延迟微乎其微。Isolates 同样可以快速扩展和部署,完全消除现有无服务器技术在这方面的问题。

上下文切换

操作系统的一个关键特性是可以同时运行多个进程。明确地在任何指定时间运行代码的各个进程之间切换。要做到这一点,它会执行所谓的 “上下文切换”:将一个进程的所有内容移出内存,并将下一个进程移入内存。

这一上下文切换可能需要 100 微秒。把它乘以在普通 Lambda 服务器上运行的所有 Node,Python 或 Go 进程时,这会产生很大的开销,这意味着并不是所有的 CPU 能够实际用于运行客户的代码。用于上下文切换上的开销太大了。

而 Isolates 系统在单个进程中运行所有代码,并使用自己的机制来确保安全的内存访问。这意味着没有昂贵的上下文切换,几乎所有的 CPU 核时都用来运行代码。

内存

**Node 或 Python 是由个人在自己的服务器上运行的。它们从来没有打算在一个多租户环境中运行,这种环境中有数千个其他人的代码和严格的内存要求。**一个不运行任何实际代码的 Node Lambda 会消耗 35 MB 内存。而如果像我们这样,在所有 Isolates 之间共享运行时,内存消耗会下降到大约 3 MB。

内存通常是运行客户代码中开销最大的(甚至高于 CPU),将其降低一个数量级将会大大提高其经济效益。

而 V8 的设计是面向多租户的。它的设计目的在于在单个进程中运行浏览器中许多选项卡中的代码。在 Node 及其他运行环境则不是这样,仅在其多租户系统中它会这样运行。

安全

在同一进程中运行多个客户的代码显然需要特别注意安全性问题。Cloudflare 自己去构建隔离层并不高效。要构建一个如此复杂的真正安全的系统需要进行大量的测试,模糊测试,渗透测试,以及资金。

而 V8 的开源性使得这件事成为可能,还因为它是世界上测试出来最安全的软件。我们还在原有基础上构建了几层安全层,包括针对定时攻击的各种保护措施。V8 奇迹般地实现了这个计算模型!

收费

这里并不是要对 AWS 收费进行讨论,但是由于经济因素很有趣,值得快速带过一下。Lambdas 是根据他们的运行时间计费的。该计费方式四舍五入到最接近的 100 毫秒,这意味着人们每次运行时平均多支付 50 毫秒的费用。更糟糕的是,他们会收取整个 Lambda 运行过程的费用,即使只是在等待外部请求完成的时间段。由于外部请求可能需要数百或数千毫秒,因此您最终可能会支付很多莫名其妙的费用。

而因为 Isolates 的内存占用空间很小,我们只能在代码实际执行时计费。

对我们而言,由于开销较低,每个 CPU 周期的工人成本降低了三倍左右。一个提供 50 毫秒 CPU 的 Worker 的成本是每百万个请求 0.50 美元,同等情况下 Lambda 每百万请求成本为 1.84 美元。我认为将成本降低三倍是一个足够强大的卖点,仅这一点就能够吸引企业转向 Isolates 供应商。

网络就是计算机

亚马逊有一款名为 Lambda @ Edge 的产品,该产品已部署到亚马逊的 CDN 数据中心。不幸的是,它比传统的 Lambda 贵三倍,而首次部署需要 30 分钟。它也不允许任意请求,这限制其类 CDN 用途。

相反,正如我之前提过的,使用 Isolates,我们能够将每个源文件部署到 155 个数据中心,其经济效益比 Amazon 部署到一个数据中心要好。运行 155 个 Isolates 实际上可能比单个容器更便宜,也可能是因为亚马逊收取的费用高于市场价格。我不知道亚马逊的经济性如何,但我们对自己很满意。

很久以前我们就知道,一个真正可靠的系统,必须部署到地球上的不止一个地方。而 Lambda 仅在单个可用区域,单个地区,单个数据中心中运行。

缺点

没有任何一项技术是完美的,每一种技术转变都有缺点。Isolates 系统的缺点在于无法运行任意编译型代码。进程级 Isolates 允许 Lambda 加载它可能用到的任何二进制文件。在 Isolates 环境中,你只能要么使用 Javascript 编写代码(我们使用大量的 TypeScript),要么使用 Go 或 Rust 等 WebAssembly 语言编写代码。

如果无法重新编译旧进程,则无法在 Isolates 中运行它们。这可能意味着基于 Isolates 的无服务器平台仅适用于不久以后的更新,更现代的应用程序。它也可能意味着遗留应用程序只能将其对延迟最敏感的组件移入 Isolates。社区也可能找到新的更好的方法将现有的应用程序转换为 WebAssembly,而这个问题将变得毫无意义。

你的帮助

我们希望你试用 Workers,并让我们和社区了解你的体验。我们还有很多事情需要完成,你的反馈将有益于我们的发展。

我们正在招聘对我们软件感兴趣并愿意带领它走向新的方向的工程师和产品经理。如果您在旧金山,奥斯汀或伦敦,请联系我们。

想要部署 Cloudflare Worker 而不在 Cloudflare 上设置域名吗?请在 workers.dev 上使用自定义子域构建无服务器应用程序。如果您已经是 Cloudflare 客户,可以 在此处将 Workers 添加到现有网站

预约 workers.dev 子域

浏览 (532)
点赞
收藏
评论