Функция Lamda повторно использовать лучшие практики
Должны ли лямбда-функции вызывать другие лямбда-функции или они должны быть автономными?
Моя среда
- Безсерверная платформа
- Nodejs
- AWS API Gateway
- AWS Lamda
- AWS DynamoDB
Я создал несколько CRUD для ресурсов API для каждой таблицы Dynamo, а сейчас я создаю несколько специализированных таблиц, которые пересекают таблицы.
Если у меня есть функция 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";
Моя альтернатива - просто получить и проверить результаты Dynamo в моей функции createTeamForecast.js. Это более замкнутый, но не очень СУХОЙ.
То, как Serverless и Lambda управляют функциями, кажется немного отсоединенным. У кого-нибудь есть плюсы или минусы?
1 ответ
Разумно импортировать нужный код из другого модуля, а не переписывать его. Это дает дополнительное преимущество, заключающееся в упрощении обслуживания вашего приложения, поскольку у вас не будет дублирующейся логики повсюду.
Хитрость с безсерверными приложениями заключается в том, чтобы найти баланс между повторным использованием кода и разделением задач. Особенности того, как это сделать, зависят от приложения. Однако, если вы вкладываете слишком много кода в каждую функцию, вполне вероятно, что ваше приложение слишком тесно связано и может использовать декомпозицию на более мелкие функции, которые более точно моделируют их проблемное пространство. Если вы обнаружите большие области общего кода в своих лямбда-функциях, это может быть хорошим индикатором того, что они должны быть преобразованы в другие функции.
Если вы моделируете действительно сложные бизнес-домены, вам также может потребоваться вызвать другие функции Lambda из функций Lambda или изучить пошаговые функции AWS, которые предоставляют конечный автомат поверх Lambda.