【问题标题】:Lamda function reuse best practicesLambda 函数重用最佳实践
【发布时间】:2018-03-30 11:23:22
【问题描述】:

Lambda 函数应该调用其他 Lambda 函数还是应该是自包含的?

我的环境是

  • 无服务器框架
  • Nodejs
  • AWS API 网关
  • AWS 拉姆达
  • AWS DynamoDB

我为每个 Dynamo 表的 API 资源构建了几个 CRUD,现在我正在创建一些跨表的专用资源。

如果我有一个函数 createTeamForecast,并且我需要从表 Team 中获取一行,我应该导入函数 getTeam 还是只编写 Dynamo 查询。我倾向于导入该函数,但我没有看到任何可以说明的内容。

getTeam.js

import * as dynamoDbLib from "./libs/dynamodb-lib";
import { apiResponse } from "./libs/response-lib";

export async function main(event, context, callback) {
  const params = {
    TableName: "teams",
    Key: {
      id: event.pathParameters.team_id
    }
  };

  try {
    const result = await dynamoDbLib.call("get", params);
    if (result.Item) {
      // Return the retrieved item
      callback(null, apiResponse(200,"OK",result.Item));
    } else {
      callback(null, apiResponse(404, "Team not found."));
    }
  } catch (e) {
    callback(null, apiResponse(500,'Server error',e));
  }
}

在我的 createTeamForecast 中,我可以只导入该函数然后调用它吗?

import { main as getTeam } from "./getTeam";

我的替代方法是在我的 createTeamForecast.js 函数中执行 Dynamo 获取和检查结果。这更加独立,但不是很干燥。

Serverless 和 Lambda 管理函数的方式,感觉有点脱节。大家有什么优缺点吗?

【问题讨论】:

  • 不太熟悉无服务器框架,但作为一般规则,我个人会尝试在单个 Lambda 中完成任务,因此请导入代码,而不是调用第二个 Lambda(您在为子 Lambda 的持续时间支付 2 倍,加上在处理超时重试时可能遇到困难)。当然,除非你的模型是故意异步扇出的。

标签: amazon-web-services aws-lambda serverless-framework


【解决方案1】:

从另一个模块导入你需要的代码而不是重写它是合理的。这样做的好处是可以更轻松地维护您的应用程序,因为您不会到处都有重复的逻辑。

无服务器应用程序的诀窍是在代码重用和关注点分离之间找到平衡。如何做到这一点的细节在某种程度上取决于应用程序。但是,如果您将太多代码放入每个函数中,那么您的应用程序可能过于紧密耦合,并且可能会使用分解为更紧密地建模其问题空间的更小的函数。如果您在 Lambda 函数中发现大量共享代码,这可能是一个很好的指标,表明它们应该被重构为其他函数。

如果您要为非常复杂的业务领域建模,那么您可能还需要考虑从 Lambda 函数中调用其他 Lambda 函数,或者研究在 Lambda 之上提供状态机的 AWS Step Functions。

【讨论】:

  • 这是有道理的。只是不确定 Serverless、Lamda 和 API Gateway 是否存在移动目标。稍微不同的问题,但是设置多个事件我发现我的策略被破坏了,因为我的无服务器更改正在生成一个新的 API 密钥。以为我可能会遇到类似的事情。
猜你喜欢
  • 1970-01-01
  • 2012-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多