Serverless 是一种云原生 (cloud-native) 开发模型,允许开发人员创建、构建和运行应用程序,而无需亲自管理服务器,而服务器管理由云提供商处理。

Serverless 模型有多种优势,例如降低成本、提供更大的可扩展性减少维护开销以及允许快速部署。无服务器还减少了延迟,因为代码可以在更靠近最终用户的地方运行。

为什么你需要 Serverless ?

Serverless 是一种基于每个用户提供后端服务的计算方法。本质上,您可以编写和部署代码,而不必担心底层基础设施。Serverless 流行有几个原因,详细如下:

按使用付费

Serverless 只按照使用的内容付费。这种支付模式类似于公用服务提供商使用的支付模式;例如,你只需为你消耗的电费付费。在这种云场景中,您只需为您使用的计算资源付费。这意味着你无需购买你可能不会使用的服务器容量,从而降低您的总体成本。

FaaS

Serverless 允许你使用function-as-a-service (FaaS) 范式来构建应用程序。FaaS 是一种以无服务化 (serverless) 的方式在云环境中运行函数特定服务器端逻辑

每个功能都需要很小并且做一件特定的事情。这种范例的优点是在部署应用程序时不需要服务器配置。你可以专注于开发功能代码,而无需构建和维护后端基础架构。

服务托管

Serverless 的一个关键原则是服务托管 (managed services) ,其中后端基础设施的配置和维护委托给云提供商。例如,你在提供一定计算水平的多个服务器上构建和运行应用程序,但你不用管理这些服务器。提供商负责保持服务器软件更新和应用安全补丁等事情。这使你可以专注于你的应用程序代码。

服务集成

服务集成 (Service integration) 是一种 Sererless 服务向其他服务进行交互和提供输入或输出的能力。

有很多 Serverless 服务可以做特定的事情;例如,你可以拥有 OSS 服务、自定义计算的计算服务以及访问数据库的数据库服务。服务集成允许你连接这些不同的服务,以便它们作为一个应用程序工作。

以上述三个服务为例,你可以使用服务集成构建应用程序,一个新对象被存储会触发你的自定义计算服务来处理该对象。计算完成后,结果将存储在您的数据库服务中。

高可伸缩性

Serverless 应用程序在配置基础架构方面具有高可伸缩性 (high scalability) 。配置快速且动态,可根据需要自动扩展和缩减。从长远来看,这会降低你的成本,并提高服务的可用性 (availability) 和可靠性 (reliability) 。提高的可用性可确保你始终拥有合适数量的基础架构来满足您的需求。

减少延迟

使用 Serverless,无需在源服务器上托管应用程序,应用程序代码可以在任何地方运行。大多数云提供商将你的代码部署到多个服务器,并允许代码在靠近最终用户的服务器上运行。这也会减少延迟 (reduce latency) ,因为用户请求只是从最近的服务器运行。

Serverless vs 面向服务的架构

除了上述好处之外,Serverless 还提供了优于service-oriented architecture (SOA) 的优势。SOA 是一种架构风格,它使用服务接口来集成独立的、可重用的和分布式的软件组件。 无服务器和 SOA 之间的主要区别在于无服务器处理基础设施供应和管理,而 SOA 使用保存代码和执行特定业务功能所需的数据集成的服务。使用无服务器,您无需管理底层基础架构。 与 SOA 相比,Serverless 的另一个好处是 Serverless 不依赖于企业服务总线 (ESB),如果出现问题,其他连接的服务会受到影响。

相关文章:Serverless 模式参考架构

你应该迁移到 Serverless 么?

Serverless 有很多优势,但也存在挑战。以下是你需要首先考虑的一些可能的问题。

构建有状态的应用程序

这时使用 Serverless 是一个挑战,因为传统数据库不适合 Serverless 工作负载。Serverless 功能无法维护持久连接和连接池。此外,它们使用 HTTP 而不是 TCP/IP 进行通信,并且它们会大幅减速,从而可能导致更长时间的重启。

这些因素意味着你的数据库选择是受限的。两个最着名的选项是 DynamoDBFirestore 。但是,Serverless 数据库的数量近年来有所增加。除了 MongoDB AtlasAzure Cosmos 等现有工具外,市场上的新选择还包括 PlanetScaleFauna

冷启动

当不使用 Serverless 功能时,它会被杀死。这意味着当它再次被调用时,它需要启动。代码执行速度暂时变慢,可能会影响你的操作。这种对一段时间未使用的函数的请求称为冷启动 (cold starts) 。

短运行任务

Serverless 主要适用于单一目的的短期任务,因此如果你需要执行深入分析长时间运行的任务,Serverless 可能不是解决方案。

例如,Lambda 函数有时间和内存限制。通常,Lambda 函数(lambda functions) 最多可以运行 15 分钟,边缘函数 (edge functions) 最多可以运行 5 秒。这可能会对你能够完成的工作施加限制。

缺乏控制

使用 Serverless 服务器,你不拥有或控制底层基础架构。这意味着硬件故障或错误以及影响服务器的任何其他问题都可能影响你的操作。如果你决定采用 Serverless 服务器,你应该选择具有强大可靠性数的提供商以及多个复制和备份服务,以保证在其硬件出现故障时的连续性。

提供商锁定

从一个提供商构建和运行 Serverless 应用程序可能意味着迁移到或使用另一个提供商的服务可能会出现问题。你可能需要重写代码并进行手动工作以迁移或与其他提供商集成。如果您打算使用 Serverless,请确保你选择的提供商拥有你需要的服务,以避免出现问题。

测试

Serverless 的测试更加复杂。开发人员可以在他们的功能代码上创建和运行单元测试,但衡量组件如何交互的集成测试在 Serverless 环境中更难执行。这是因为每次创建 Serverless 函数时,都会创建一个新版本的自身,这使得很难收集必要的数据来调试和修复函数。

相关文章:将测试驱动开发应用于您的数据库

Severless 的实际用例

Serverless 主要用于管理请求流量有波动的工作负载;例如,请求流量可能偶尔才会出现间歇性峰值 (intermittent spike) 。因此,无服务器包括以下主要用例。

事件触发器

Serverless 非常适合触发一个事件或一系列事件的任何活动,例如变更数据捕获。对数据库的更改可以触发复制作业以确保更新备份数据库。

相关:什么是变更数据捕获?

异步处理

Serverless 功能可以处理后台应用程序任务。例如,调整图像文件的大小以及在上传后转录或转码视频。它在不增加任何面向用户的延迟的情况下执行此操作,因为任务会继续执行而不会中断应用程序的流程。

CI/CD

持续集成/持续部署 (CI/CD) 管道允许你以小增量推送代码,以便快速修复和更新错误。Serverless 可以自动化这些过程。例如,当你提交对代码的更改时,可以触发 Severless 函数来创建构建。创建拉取请求时,可以触发 Serverless 函数以启动自动化测试。

多语言应用

Serverless 允许你构建多语言应用 (polyglot application) ,这意味着你可以使用多种编程语言并以最适合该功能的语言构建每个功能。这可以防止你被传统语言锁定,因为可以使用新语言来构建新功能。

自动伸缩的应用

Serverless 应用可以自动扩展以满足需求,因此它们可用于聊天机器人网站应用程序编程接口 (API) 等应用程序。

结论

正如你在本文中看到的,采用 Serverless 的原因有很多。这样做可以让你简化工作流程降低成本并提高可伸缩性,以及其他好处。如果加你确保选择正确的提供商,即使是潜在的劣势也可以考虑在内。

参考资料:

> https://fauna.com/blog/why-everyone-wants-to-go-serverless#reduced-latency