在 上一篇文章 中,我们探索了 Serverless 的工作原理。本质上,Serverless 利用分层调度和快速冷启动,使其在没有事件处理时能够缩放到零。这就像一个声控灯,有人时亮起,房间空无一人时自动关闭。
理解了基本原理后,你可能好奇这项令人印象深刻的技术有什么实际应用。今天,我们将深入探讨 Serverless 的使用场景。然而,理解其应用的前提是理解它的进程模型——这与冷启动同样关键。
Serverless 进程模型
让我们回顾一下上次提到的 Serverless 冷启动过程。回想一下,云提供商管理容器和运行时的准备阶段,我们只需关注函数执行。在 Serverless 领域,函数执行由“函数服务”处理。当函数触发器发出“事件”到达的信号时,函数服务根据需要创建函数实例并执行相应的函数。一旦函数执行完毕,其关联的实例就会退出,允许 Serverless 应用程序缩放到零并进入省电模式。
现在,你可能想知道是否可以在函数执行后保持实例存活而不是终止它,让它等待下一次函数调用。这将消除每次的冷启动开销,从而获得更快的响应时间。
确实,Serverless 已经预见到了这种情况。因此,从运行函数实例的进程角度来看,存在两种模型:
- 运行至完成: 在此模型中,函数实例一旦就绪,执行函数并立即终止。这是 Serverless 最纯粹的使用方式。
- 持久进程: 在这里,函数实例就绪后,并不会在函数完成后停止。相反,它会返回并耐心等待下一次函数调用。请注意,即使在这种模型中,如果在一定时间内没有事件触发,云提供商最终也会销毁函数实例。
数据编排
大多数工程师都熟悉 MVC(模型-视图-控制器)模式,这是一种非常成功的设计范式。然而,前端 MVVM 框架的兴起推动了 View 层的前移,导致了 SPA(单页应用)的出现。相反,后端的 Control 和 Model 层则下沉,催生了面向服务的后端应用。
这种转变使得前后端更加彻底地解耦。前端开发可以独立进行,依赖 mock 数据接口,而后端团队则可以专注于数据接口开发。然而,这种分离引入了一个具有高网络 I/O 的数据网关层。
Node.js 凭借其异步非阻塞的特性,以及 JavaScript 对前端工程师的亲和力,自然而然地承担了数据网关层的角色。这导致了 Node.js BFF(Backend For Frontend)层的出现,它编排后端数据和接口,将其调整为适合前端消费的数据结构。
BFF 层充当了连接前后端的中介。未经处理的数据,通常称为原始数据或元数据,对最终用户来说几乎不可读。因此,我们需要组合和处理相关数据,增加价值,使其有意义。这种组合和处理的过程称为数据编排。
传统上,为 BFF 层管理 Node.js 应用程序需要大量资源,需要虚拟机或 PaaS 平台。然而,由于 BFF 层主要执行无状态的数据编排,我们可以使用 运行至完成 模型的 Serverless 无缝替换 Node.js 应用程序。这就是越来越流行的术语 SFF(Serverless For Frontend)的本质。
理解了从 BFF 到 SFF 的演进后,让我们追溯新的请求流程。当前端发起数据请求时,函数触发器激活我们的函数服务。然后我们的函数启动,调用后端的元数据接口,处理返回的元数据为前端所需的格式,最后,我们的 Serverless 函数可以好好休息了。
服务编排
服务编排与数据编排类似,主要区别在于它专注于组合和处理云提供商提供的各种服务。虽然这个概念在 Serverless 之前就已存在,但其传统实现受限于服务支持的 SDK 语言版本。通常,我们会使用 YAML 文件或命令行界面来编排服务。要使用这些服务或 API,我们需要在我们偏好的编程语言中找到相应的 SDK,将其加载到代码中,并使用密钥调用 SDK 方法进行编排。与数据编排类似,后端操作和部署成本很高,而且如果没有 SDK,我们需要根据平台的接口或协议手动实现。
Serverless 扩展了 SDK 使用的边界。例如,假设一个 Web 服务需要通过电子邮件发送验证码。我们可以使用 运行至完成 ** 的 Serverless 函数,利用云提供商的 SDK 发送电子邮件。同时,一个 ** 持久进程 的 Serverless 函数可以生成随机字符串验证码,存储起来,并触发发送电子邮件的 Serverless 函数将验证码投递到用户收件箱。在验证时,我们可以再次调用持久 Serverless 函数来验证验证码。
Serverless 的一个显著优势是其语言无关性。这使得开发团队不再受限于单一语言,可以利用 Java、PHP、Python、Node.js 等语言的优势共同构建复杂的应用程序。
Serverless 服务编排的开放性已引起云提供商的极大关注。它支持创建多样而复杂的服务编排场景,同时保持语言无关性,极大地扩展了各种云服务的使用案例。然而,这也要求开发者熟悉所选云提供商提供的各类服务。
总结
- Serverless 有两种进程模型:持久进程类型和用完即毁类型。持久进程类型是为了适应传统的 MVC 架构而设计的,看起来不太自然;如果你从现在开始使用 Serverless,我绝对推荐 用完即毁 模型,它能最大化 Serverless 的优势。
- 追溯历史,我梳理了通过前后端分离发展而来的 BFF,然后可以用 SFF 替代。无论是内部接口编排还是外部数据编排,Serverless 都能发挥巨大优势。
- 从数据编排更进一步,我们可以利用 Serverless 和云服务提供商的能力实现服务编排,创建更强大的复合服务场景,提升我们的研发效率。
Novita AI 是一个全合一云平台,助力实现您的 AI 雄心。集成 API、Serverless、GPU 实例——您需要的经济高效工具。无需基础设施,免费开始,让您的 AI 愿景成为现实。
推荐阅读
