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添加到现有网站。