解决 Serverless 框架中函数运行时间过长引起的问题

Serverless 架构已经成为了现代应用程序的一种首选方案,这是因为它可以让开发者将关注点从基础设施层移除,将精力集中于业务逻辑。然而,使用 Serverless 架构时,函数运行时间过长可能会导致一些问题,比如 HTTP 连接超时、函数执行超时等。本文将介绍 Serverless 架构中函数运行时间过长引起的问题,以及解决这些问题的方法。

问题分析

当函数将处理时间超过一定阈值时,请求将因为超时而失败。如果我们直接将阈值设置得更高,这可能会导致函数成为长时间运行的函数,并可能导致更多的问题,比如高运行成本和不可预测的行为。 这里是一个在处理负载时引起问题的示例:假设我们有一个函数 convertImage,该函数从 AWS S3 存储桶中读取图片,将其转换为另一种格式,并将其上传到同一个存储桶中。如果 S3 存储桶包含大量图像,例如 100,000 张图像,我们将面临一个问题。

解决方案

了解问题后,我们可以使用下面的解决方案来应对这些问题。这些解决方案旨在使您的函数在处理更大的工作负载时更高效,而不是使用更高的阈值。

  1. 实现函数时间截止

您可以将函数时间限制设置为 10 分钟,以确保函数可以按时退出并释放资源。如果您使用的是 AWS Lambda,则您可以将此配置设置为 Lambda 配置文件中的值或称为 serverless.yml。您可以这样配置:

----------
 ---------------
  -------- --------------------
  -------- --- ------------- --- -
  1. 优化代码

您可以通过使用异步编程模型来优化函数代码。例如,使用 Promise 来预取图像并将代码与需要响应的计算任务分离。 在下面的代码片段中,我们定义了一个静态变量 s3 来保存 AWS.S3 类。这有助于节省对象创建成本,并从 Lambda 响应计算中分离了对象准备:

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

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

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

---

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

     --------
     -------- -- -
       -- -------------------
       ----------------------------------- --------------- -
         -- -------------
       -------------- ------------- -
         -- ------
       ----------------- ---------- -
         -- -------------
         -----------
       ----------
     ---
   -
   ---
  1. 拆分代码基线

您可以将代码拆分为更小的组件,以便可以细粒度地控制其生命周期。这有助于减少运行时间并使代码更可维护。 这是一个例子,我们将代码拆分为三个 Lambda 函数:

  • 触发器函数:该函数根据 S3 存储桶事件触发,它通过 SNS 主题向其他 Lambda 函数发送消息。 它只需要 5 秒钟才能运行。
  • 转换函数:它是一个处理每个图像的函数,可以扩展。它将拆分为多个任务,每个任务处理 10 张图像。这是因为转换 10 张图像的时间大约为 1 分钟,因此在 10 分钟的时间限制内可以并行处理 10 个任务(每个任务处理 10 张图像,总共处理 100 张图像)。使用 Promise 来处理任务,以使代码更加可读和可维护。
  • 完成函数:它会更新转换的图像的状态,并将完整数据写入 DynamoDB。

结论

通过实施这些最佳实践,您可以大大将函数运行时间缩短,并在 Serverless 架构中无缝运行应用程序。 优化代码、限制函数时间并拆分代码基线是 Serverless 架构中函数超时的解决方案之一。当您在开发下一代 Serverless 系统时,请考虑这些建议,以保持您的 Lambda 函数的最佳性能。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/671a0e429babaf620fa0b9e6