Serverless 架构已经成为了现代应用程序的一种首选方案,这是因为它可以让开发者将关注点从基础设施层移除,将精力集中于业务逻辑。然而,使用 Serverless 架构时,函数运行时间过长可能会导致一些问题,比如 HTTP 连接超时、函数执行超时等。本文将介绍 Serverless 架构中函数运行时间过长引起的问题,以及解决这些问题的方法。
问题分析
当函数将处理时间超过一定阈值时,请求将因为超时而失败。如果我们直接将阈值设置得更高,这可能会导致函数成为长时间运行的函数,并可能导致更多的问题,比如高运行成本和不可预测的行为。 这里是一个在处理负载时引起问题的示例:假设我们有一个函数 convertImage,该函数从 AWS S3 存储桶中读取图片,将其转换为另一种格式,并将其上传到同一个存储桶中。如果 S3 存储桶包含大量图像,例如 100,000 张图像,我们将面临一个问题。
解决方案
了解问题后,我们可以使用下面的解决方案来应对这些问题。这些解决方案旨在使您的函数在处理更大的工作负载时更高效,而不是使用更高的阈值。
- 实现函数时间截止
您可以将函数时间限制设置为 10 分钟,以确保函数可以按时退出并释放资源。如果您使用的是 AWS Lambda,则您可以将此配置设置为 Lambda 配置文件中的值或称为 serverless.yml。您可以这样配置:
functions: imageConverter: handler: convertImage.handler timeout: 600 #指定函数运行的最长时间为 600 秒
- 优化代码
您可以通过使用异步编程模型来优化函数代码。例如,使用 Promise 来预取图像并将代码与需要响应的计算任务分离。 在下面的代码片段中,我们定义了一个静态变量 s3 来保存 AWS.S3 类。这有助于节省对象创建成本,并从 Lambda 响应计算中分离了对象准备:
-- -------------------- ---- ------- --- --- - ------------------- --- ----- - ----------------- -- -------------------------------------------- --- --- --- ----------- - --- --- ---------- - ------------ --- ------ - ------------------ --- ----------------- - -------------------- -- ---------------------- -------- --------- ------ --- ----------------- ------- -- - -- ---- - ------------ - ---- - -- - --- --------- ------------ - --- - --- -------------------------- -- ---------------- ------ --- - -------------- ------------------ - --- ------ - - ------- ----------- ---- ---------- -- -------- -------- -- - -- ------------------- ----------------------------------- --------------- - -- ------------- -------------- ------------- - -- ------ ----------------- ---------- - -- ------------- ----------- ---------- --- - ---
- 拆分代码基线
您可以将代码拆分为更小的组件,以便可以细粒度地控制其生命周期。这有助于减少运行时间并使代码更可维护。 这是一个例子,我们将代码拆分为三个 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