Функция 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.

Другие вопросы по тегам