什么是无服务器?
无服务器,顾名思义,指的是无服务器计算。你可能会想,没有服务器怎么可能进行计算?实际上,无服务器并非真的没有服务器。而是通过技术手段,将服务器的概念从业务逻辑中抽象出来,让开发者只需专注于应用程序,无需操心底层基础设施。
无服务器如何工作?
自从无服务器出现以来,许多开发者认为它是一项新技术——这确实没错,因为它带来了极大的便利。不过,我们不必过度复杂化或对此感到畏惧。应用运行的基本逻辑并没有改变。无服务器只是通过技术手段屏蔽了其中的复杂性,与其他云技术并无二致。
在无服务器出现之前,部署一个 Web 应用是一个繁琐的过程。要想运行我们的应用,必须先在服务器端构建运行时环境。这包括购买虚拟机、初始化环境、安装所需的依赖项——尽可能确保与本地开发环境一致。接下来,为了让用户能访问我们的应用,需要购买域名、使用虚拟机的 IP 地址进行注册、配置并启动 Nginx,最后上传并启动应用代码。
与传统的流程截然不同,无服务器部署只需三个简单的步骤,是对服务端操作的极致抽象。本质上,用户 HTTP 数据请求的整条链路在质上没有改变;无服务器只是简化了整个模型。
具体来说,以前我们必须在服务器端构建运行时环境,而 FaaS 应用将此步骤抽象为函数服务。以前我们需要负载均衡和反向代理,而 FaaS 应用将其抽象为 HTTP 函数触发器。以前需要上传代码并启动应用,而 FaaS 应用将其抽象为函数代码。
当用户第一次访问 HTTP 函数触发器时,触发器会持有用户的 HTTP 请求,并为函数服务生成一个 HTTP 请求事件通知。
函数服务随后检查是否有空闲的函数实例。如果没有,它会从函数代码仓库获取你的代码,初始化并启动一个函数实例,执行函数,将 HTTP 请求对象作为参数传入,并运行该函数。
此外,函数执行的 HTTP 响应会返回给函数触发器,然后触发器将结果转发给等待的用户客户端。
无服务器与托管应用的 PaaS 平台之间最显著的区别在于资源利用率,这也是无服务器最突出的创新之处。无服务器应用实例可以缩放到零,而 PaaS 平台至少需要始终运行一个服务器或容器。
在第一次调用之前,一个函数实际占用的服务器资源为零。只有当用户发起 HTTP 数据请求时,函数服务才会被 HTTP 事件触发,启动一个函数实例。这意味着没有用户请求时,函数服务没有运行中的实例,不消耗任何服务器资源。相反,在 PaaS 平台上创建应用实例通常需要几十秒,并且为了确保服务可用,至少需要一台服务器持续运行你的应用实例。
打个比方,无服务器就像一个声控灯,有人时迅速亮起,没人时自动关闭。与传统的手动开关灯相比,声控灯在节能方面表现出色。然而,这种节能能力取决于声控灯在需要时能快速亮起。
同样,无服务器的优势关键在于其快速启动的能力。它是如何做到的呢?
为什么无服务器能启动得如此之快?
冷启动原本是一个 PC 概念,指的是断电后重新加载 BIOS 表(即从硬件驱动启动)的过程,导致启动缓慢。
在当今的云环境中,几乎不会对物理服务器进行断电重启。在无服务器的语境下,冷启动指的是从函数被调用到函数实例就绪的整个过程。我们的目标是尽可能缩短启动时间,因为启动时间越短,资源利用率就越高。当前云提供商利用各自语言的优化,平均冷启动时间在 100 到 700 毫秒之间。得益于 Google 的 JavaScript 引擎中的即时编译技术,Node.js 的冷启动速度最快。
值得注意的是,无服务器服务可以从零开始,执行一个函数,并在 100 毫秒内完成整个过程——这是无服务器能够自信地缩放到零的关键原因。打开网页时,响应时间低于一秒通常被视为极佳表现。在此背景下,100 毫秒的启动时间对页面加载时间的影响微乎其微。
此外,我们可以放心地认为云提供商会继续优化其基础设施,以实现更快的启动速度,最终提高资源利用率。例如,下载函数代码是冷启动中耗时的一步。因此,在代码更新时,云提供商通常会主动发起资源调度,为你的函数实例下载并构建容器镜像。当第一个请求到达时,它们可以利用这些缓存的镜像,跳过冷启动中的代码下载步骤,直接从容器的镜像启动。这种技术被称为热启动。因此,对于延迟敏感的应用,我们可以利用热启动或实例预热策略来加速或完全规避冷启动的时间。
无服务器是如何分层设计的?
当你的无服务器实例运行时,它至少包含三层:容器、运行时和函数代码。
把容器想象成操作系统(OS)。代码执行需要与硬件交互,容器模拟了内核和硬件信息,让你的代码和运行时能在其中运行。容器信息包括内存大小、操作系统版本、CPU 详情、环境变量等。目前,FaaS 实现可能使用 Docker 容器、虚拟机甚至沙箱环境。
运行时代表函数执行的上下文。运行时信息包括使用的编程语言和版本,例如 Node.js v10 或 Python 3.6;可调用的对象,如阿里云 SDK;以及环境变量等系统信息。
这种分层设计有什么好处?容器层适用性更广,云提供商可以预热大量容器实例,有效分割物理服务器资源。运行时实例适用性较低,可以预热更少的数量。一旦容器和运行时固定,下载和执行代码就变得简单了。这种分层架构实现了高效的资源优化,让你的代码能够快速且经济地执行。
总结
- 一个纯粹的无服务器应用的调用链包含三个主要组件:函数触发器、函数服务和函数代码。它们分别替代了传统的服务端操作:负载均衡与反向代理、服务器与应用运行时环境、以及应用代码部署。
- 无服务器与传统托管应用的 PaaS 平台之间最显著的区别在于,无服务器应用能够缩放到零,并在事件触发时快速启动。例如,Node.js 函数可以在 100 毫秒内完成启动和执行。
- 从设计上看,无服务器牺牲了用户控制权和适用范围,以简化代码模型。其分层结构进一步提高了资源利用率,这也是其冷启动时间极短的主要原因。
Novita AI 将为我们用户推出无服务器服务,立即加入等候名单,使用无服务器计算开始您的业务。
Novita AI 是一个一站式云平台,助您实现 AI 抱负。集成 API、无服务器、GPU 实例——您需要的经济高效工具。无需操心基础设施,免费开始,让您的 AI 愿景成为现实。
推荐阅读
