如何减少 Serverless 究竟有多 “无服务器” 的冷启动时间?

阅读时长 6 分钟读完

Serverless 是一种新兴的云计算架构,它的特点是无需管理服务器,只需要编写代码即可实现应用部署和运行。然而,Serverless 的冷启动时间却是一个令人头痛的问题,不少开发者在实际使用中发现,函数冷启动需要的时间过长,会对应用的响应速度产生负面影响。本文将介绍 Serverless 的冷启动时间问题,并提供一些减少冷启动时间的方法和技巧。

Serverless 的冷启动时间问题

在 Serverless 架构中,一个函数被触发时,云服务提供商需要将函数的代码加载到一个虚拟机中,并执行函数。这个过程被称为“冷启动”。由于虚拟机的启动需要时间,因此函数的冷启动时间会影响应用的响应速度。具体而言,当一个函数长时间没有被调用时,虚拟机会被销毁,下一次调用时需要重新创建虚拟机,这就是所谓的“冷启动”。

Serverless 的冷启动时间问题是一个广泛存在的问题,不同的云服务提供商的冷启动时间也有所不同。下表列出了一些常见的云服务提供商的冷启动时间。

云服务提供商 冷启动时间(秒)
AWS Lambda 0.5 - 10
Google Cloud Functions 0.2 - 10
Azure Functions 1 - 10

如上表所示,不同的云服务提供商的冷启动时间都在几秒钟到十秒钟之间。对于需要频繁调用的函数,这个时间可能会对应用的响应速度产生负面影响。

减少 Serverless 冷启动时间的方法和技巧

为了减少 Serverless 的冷启动时间,我们可以采取以下方法和技巧。

1. 使用预热技术

预热技术是一种常用的减少冷启动时间的方法。预热技术的核心思想是在函数被调用之前,提前执行一次函数,使虚拟机得以启动并加载函数的代码。这样,当函数被实际调用时,虚拟机已经启动完成,函数可以直接执行,从而减少了冷启动时间。

以下是一个使用预热技术的示例代码:

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

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

在上面的代码中,我们使用了 AWS SDK 中的 invoke 函数,提前执行了一次函数。如果函数是在 AWS Lambda 中运行的,我们可以通过判断 invokedFunctionArn 中是否包含 :function: 来确定函数是否需要预热。

2. 使用持续运行技术

持续运行技术是一种另类的减少冷启动时间的方法。持续运行技术的核心思想是让函数一直保持运行状态,避免虚拟机的销毁和重建。这样,当函数被实际调用时,虚拟机已经处于运行状态,函数可以直接执行,从而减少了冷启动时间。

以下是一个使用持续运行技术的示例代码:

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

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

在上面的代码中,我们使用了 AWS SDK 中的 updateFunctionConfiguration 函数,将函数的超时时间设置为 900 秒(15 分钟)。这样,当函数被调用时,虚拟机不会被销毁,函数可以一直处于运行状态,从而避免了冷启动时间。

3. 使用缓存技术

缓存技术是一种常用的减少冷启动时间的方法。缓存技术的核心思想是将函数的执行结果缓存起来,当下一次调用时,直接返回缓存的结果。这样,即使虚拟机被销毁,下一次调用时也可以直接返回结果,从而减少了冷启动时间。

以下是一个使用缓存技术的示例代码:

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

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

在上面的代码中,我们使用了一个对象 cache 来缓存函数的执行结果。当函数被调用时,我们将参数对象 event 序列化成字符串,并用作缓存的键值。如果缓存中已经存在对应的结果,我们直接返回缓存的结果,否则执行函数的代码,并将结果缓存起来。

4. 使用异步执行技术

异步执行技术是一种减少冷启动时间的方法。异步执行技术的核心思想是将函数的执行过程分为两个阶段:启动阶段和执行阶段。启动阶段负责加载函数的代码和初始化环境,执行阶段负责实际执行函数。通过将启动阶段和执行阶段分离,我们可以在启动阶段中处理一些耗时的操作,从而减少执行阶段的时间,进而减少冷启动时间。

以下是一个使用异步执行技术的示例代码:

在上面的代码中,我们使用了一个 Promise 对象来实现异步执行。在 Promise 的构造函数中,我们编写了启动阶段的代码,并在代码执行完成后调用 resolve 函数。在 Promise 对象返回后,我们可以直接调用 await 关键字等待执行阶段的代码执行完毕。

结论

Serverless 的冷启动时间问题是一个令人头痛的问题,但是我们可以采取一些方法和技巧来减少冷启动时间,提高应用的响应速度。在实际开发中,我们可以根据应用的具体情况,选择合适的方法和技巧,从而达到最佳的性能和用户体验。

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

纠错
反馈