Кэширующий код соединения с БД в безсерверной функции выполняется только один раз - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть лямбда-функция, которая подключается к экземпляру MongoDB, и добавляю логику повторного использования пула соединений, чтобы при повторном использовании lambda-контейнера использовалось предыдущее соединение вместо создания нового.

В моем database.ts файле ранее был один export const db = mongo.createConnection(..), который использовался повсюду в коде, который создавал новое соединение при каждом вызове функции.

Теперь, согласно онлайн-учебникам, я сохранил фактическую переменную соединения в глобальной переменной в файле и преобразовал экспорт в функцию, которая проверяет, является ли вышеупомянутый объект соединения не null, и еслипоэтому возвращает его без создания нового соединения.Если это действительно null, то он создает соединение и присваивает результат createConnection переменной, а также возвращает его.

Конечно, мне нужно было преобразовать все случаи использования db вdb(), так как теперь это была функция.В журналах, добавленных в файл, указывалось, что соединение действительно использовалось для всех последующих вызовов на db после первого.

Затем я преобразовал db в IIFE и вернулся к обычному экспорту.Я подумал, что вместо того, чтобы идти и заменять все использования в вызове функции, было бы лучше вместо этого вызвать его в файле и затем экспортировать.

Однако сейчас все происходит странно.Первый вызов показывает, что создается новое соединение.(=> Creating a new database connection) в коде.Однако при последующих вызовах ни один из операторов журнала не печатается.В идеале, не следует (=> Reusing an existing connection) печатать на консоли?Я предполагаю, что соединение все еще используется повторно, так как первый журнал не появляется, но почему происходит это явление?

Я знаю, что это как-то связано с тем, как модули require d или кэшируются, и как AWS Lambda обрабатывает модули JS.Любое дальнейшее понимание будет полезно.

let connection: mongoose.Connection | null = null;
let isPreviousConnectionAvailable = false;

export const db = (() => {
  if (!isPreviousConnectionAvailable) {
    log.debug('=> Creating a new database connection.');
    connection = mongoose.createConnection(dbConnectionURL, { useNewUrlParser: true });
    isPreviousConnectionAvailable = true;
  } else {
    log.debug('=> Reusing an existing database connection');
  }

  return connection;
})();

1 Ответ

0 голосов
/ 01 февраля 2019

Журналы не будут напечатаны.Когда он вызывается в первый раз, он импортируется, а затем вы получаете доступ к той же константе, когда контейнер теплый.Это ожидаемое поведение.

...