Serverless 部署复杂性的降维打击

阅读时长 5 分钟读完

随着云计算技术的发展,Serverless 成为了一个备受关注的技术趋势。Serverless 可以让开发者专注于业务逻辑而不是基础设施,免去了自己搭建服务器的压力。但是,Serverless 的部署复杂性也给开发者带来了一定的挑战。

什么是 Serverless

简单来说,Serverless 是一种计算模式,它不需要开发者自己去管理服务器。在 Serverless 中,开发者可以通过函数完成代码逻辑的实现,函数的运行和维护都是由云服务厂商来完成的。因此,Serverless 的特点是节省成本、敏捷部署、低维护和按需付费。

Serverless 的部署复杂性

尽管 Serverless 极大地降低了开发者的运维成本,但状态管理、依赖管理和持久化等问题依然存在。除此之外,部署的环境、域名管理以及函数版本等内容也存在一定的复杂度。下面我们分别展开讨论一下。

状态管理

在 Serverless 中,状态是指各种运行上下文中的状态,包括函数状态、Web 应用状态、用户状态等等。其中,函数状态是最容易被忽视的部分。

通常情况下,Serverless 函数应该是幂等的。幂等是指函数的输出只与输入相关,与其它状态无关,对于函数来说始终是一样的。幂等的设计不需要考虑状态,但是一些业务场景无法实现幂等,如查询实时价格、创建订单等场景。这时,我们需要引入状态管理来解决这个问题。常用的状态管理方式包括使用数据库、使用全局存储服务等。

依赖管理

Serverless 函数通常需要依赖一些第三方库。在本地开发时,我们可以使用 package.json 管理依赖库。但是在部署时,需要将所有依赖打包到函数中进行上传。如果没有正确地打包,会导致函数无法正常调用。

为了解决这个问题,我们可以使用构建工具来自动打包依赖。对于 Node.js 函数,可以使用 webpack 或者 rollup。对于 Python 函数,可以使用 pipenv 。

持久化

Serverless 函数是自动扩缩容的,函数状态直接保存在内存中。这就要求我们需要使用其他的持久化方式,如数据库或者存储服务,来保存重要的业务数据。否则,当函数扩缩容时,函数状态就会无限制地丢失。

部署环境

Serverless 部署环境各不相同,需要按照不同的云服务厂商的要求进行配置。如果你同时使用多个云厂商,就需要在不同的平台上进行配置,大大增加了部署的复杂度。为了解决这个问题,我们可以使用类似 Terraform、 AWS CDK 或者 Serverless Framework 的工具来管理 Serverless 资源。

域名管理

如果我们需要将自己的 Serverless 函数暴露在公网上,通常需要配置域名。在 Serverless 中,域名管理也是个棘手的问题。对于不同的云服务商,可以使用各自的 DNS 服务,如 AWS Route 53 或者阿里云 DNS。如果你同时使用多个云服务商,就需要在多个平台上进行配置。

函数版本

在 Serverless 中,代码和配置都是定义在函数内部的。这就意味着当你需要更新函数代码和配置时,需要手动维护版本号。如果你使用了多个代码库和多个云服务商,就需要在多个平台上进行版本管理。为了解决这个问题,我们可以使用 Serverless Framework 中的变量功能来处理版本号,从而实现自动化的部署。

Serverless 部署最佳实践

基于上述 Serverless 部署复杂性,我们可以在实际开发中采取以下的最佳实践。

  1. 尽量将业务状态保存在数据库或者全局存储中。
  2. 使用构建工具自动打包第三方依赖库。
  3. 针对需要较长时间执行的任务,使用异步的方式,比如使用消息队列。
  4. 在部署环境中使用工具进行资源管理,实现控制可追溯和灵活度。
  5. 集中管理域名和 HTTPS 证书,使用云服务商提供的服务实现灵活配置。
  6. 使用 Serverless Framework 等工具自动化构建和部署,实现版本自动化处理。

下面是一个 Serverless 示例代码,实现在 AWS Lambda 上创建一条记录方式:

-- -------------------- ---- -------
------ ----
------ -----

-------- - --------------------------
----- - ----------------------------

--- --------------------- ---------
    ---- - -
        ----- ------------
        ------- --------------
        ------ ------------
    -

    -------- - ---------------
       ---------
    -
    ------ -
        ------------- ----
        ------- ------------------ ------------ ---------
    -

如上所示,我们可以使用 Boto3 库在 Python 函数中访问 AWS DynamoDB 表,实现记录创建功能。

结论

Serverless 给云计算、互联网服务提供了全新的灵活性和弹性。对于开发者来说,Serverless 化可以更大地提高开发效率和灵活性。而处理 Serverless 的部署复杂性是必不可少的技能之一。通过本文介绍的技巧和最佳实践,我们可以在 Serverless 路上更加得心应手!

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6750f7d6050cf9039c1837cd

纠错
反馈