Lambda 函数重用最佳实践
Lamda function reuse best practices
Lambda 函数应该调用其他 Lambda 函数还是应该自包含?
我的环境是
- 无服务器框架
- 节点
- AWS API 网关
- AWS Lamda
- AWS DynamoDB
我已经为每个 Dynamo API 资源构建了多个 CRUD table,现在我正在创建一些跨 tables 的专用资源。
如果我有函数 createTeamForecast,并且我需要从 table 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 管理功能的方式,感觉有点脱节。谁有任何优点或缺点?
从另一个模块导入你需要的代码而不是重写它是合理的。这样做的附带好处是可以更轻松地维护您的应用程序,因为您不会到处都有重复的逻辑。
无服务器应用程序的诀窍是在代码 re-use 和关注点分离之间找到平衡。如何做到这一点的细节在某种程度上取决于应用程序。但是,如果您在每个函数中放置了太多代码,那么您的应用程序很可能耦合得太紧,可以使用分解为更小的函数来更紧密地模拟它们的问题 space。如果您在 Lambda 函数中发现大量共享代码,这可能是一个很好的指标,表明它们应该重构到其他函数中。
如果您正在为非常复杂的业务领域建模,那么您可能还需要考虑从 Lambda 函数中调用其他 Lambda 函数,或者研究在 Lambda 之上提供状态机的 AWS Step Functions。
Lambda 函数应该调用其他 Lambda 函数还是应该自包含?
我的环境是
- 无服务器框架
- 节点
- AWS API 网关
- AWS Lamda
- AWS DynamoDB
我已经为每个 Dynamo API 资源构建了多个 CRUD table,现在我正在创建一些跨 tables 的专用资源。
如果我有函数 createTeamForecast,并且我需要从 table 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 管理功能的方式,感觉有点脱节。谁有任何优点或缺点?
从另一个模块导入你需要的代码而不是重写它是合理的。这样做的附带好处是可以更轻松地维护您的应用程序,因为您不会到处都有重复的逻辑。
无服务器应用程序的诀窍是在代码 re-use 和关注点分离之间找到平衡。如何做到这一点的细节在某种程度上取决于应用程序。但是,如果您在每个函数中放置了太多代码,那么您的应用程序很可能耦合得太紧,可以使用分解为更小的函数来更紧密地模拟它们的问题 space。如果您在 Lambda 函数中发现大量共享代码,这可能是一个很好的指标,表明它们应该重构到其他函数中。
如果您正在为非常复杂的业务领域建模,那么您可能还需要考虑从 Lambda 函数中调用其他 Lambda 函数,或者研究在 Lambda 之上提供状态机的 AWS Step Functions。