Тайм-аут соединения AWS Lambda - Mongoose - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь повторно использовать соединение mongodb для AWS Lambdas, это моя функция соединения:

const openMongodbConnection = ({ config }) => (
  process.mongoConnection ? Promise.resolve() : mongoose.connect(config.MONGO_URL, {
    bufferCommands: false,
    bufferMaxEntries: 0,
    keepAlive: true,
  })

  .then((connection) => {
    process.mongoConnection = connection;
    return Promise.resolve();
  }, err => (
    Promise.reject({
      statusCode: 500,
      errorCode: [{
        code: 'DatabaseError',
        description: `unable to connect to mongo db: ${err} ${JSON.stringify(config)}`,
      }],
    })
  ))
);

База данных находится в AWS VPC и не имеет внешнего доступа.Холодный запуск работает отлично, но иногда я получаю ошибку тайм-аута, как это:

2018-10-03T18:36:06.984Z    7ab97df7-c739-11e8-89bf-87260b172585    MongoNetworkError: connection 2 to some.ip.from.server:27017 timed out
at Socket.<anonymous> (/var/task/node_modules/mongodb-core/lib/connection/connection.js:258:7)
at Socket.g (events.js:292:16)
at emitNone (events.js:86:13)
at Socket.emit (events.js:185:7)
at Socket._onTimeout (net.js:338:8)
at ontimeout (timers.js:386:14)
at tryOnTimeout (timers.js:250:5)
at Timer.listOnTimeout (timers.js:214:5)

У меня также есть context.callbackWaitsForEmptyEventLoop = false; прямо в начале функции.

Эта ошибка совершенно случайна,иногда работает, а иногда нет, я думаю об открытии и закрытии соединения каждый раз, когда приходит новый запрос, но я знаю, что это снизит производительность lambdas, а также увеличит операции ввода-вывода с сервера mongodb.

Помощь будет принята с благодарностью.

Ответы [ 2 ]

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

Проблема в том, что лямбда-функция запускается из AWS Fargate.

Когда AWS использует IAMRole: PassRole, он тормозит конфигурацию VPC / подсети, в результате чего лямбда-функция не может подключиться к базе данных mongo.

0 голосов
/ 09 октября 2018

Ну, я пришел сюда в поисках ответа на этот вопрос сам ... во всяком случае, ЕДИНСТВЕННЫЙ ответ, который мы нашли до сих пор, - это открывать и закрывать соединение с БД каждый раз, когда вызывается лямбда.

Очевидно, что когда лямбда не работает, AWS приостанавливает процесс, что означает, что сокет выглядит мертвым для сервера mongodb, поэтому он разрывает соединение, потому что считает его мертвым клиентом.Таким образом, попытка сохранить сокет между лямбда-вызовами приводит к этому таймауту довольно часто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...