NodeJS AWS Lambda: соединение потеряно: сервер закрыл соединение - PullRequest
0 голосов
/ 23 января 2020

У меня установлена ​​лямбда-функция на AWS. Эта лямбда-функция построена поверх NodeJS. Эта лямбда-функция содержит несколько сценариев, каждый из которых запускается определенным событием. В последнее время я получаю следующую ошибку в случайное время и во время выполнения случайных сценариев (я не могу найти шаблон).

{
    "errorType": "Error",
    "errorMessage": "Connection lost: The server closed the connection.",
    "code": "PROTOCOL_CONNECTION_LOST",
    "fatal": true,
    "stack": [
        "Error: Connection lost: The server closed the connection.",
        "    at Protocol.end (/var/task/node_modules/mysql/lib/protocol/Protocol.js:112:13)",
        "    at Socket.<anonymous> (/var/task/node_modules/mysql/lib/Connection.js:97:28)",
        "    at Socket.<anonymous> (/var/task/node_modules/mysql/lib/Connection.js:525:10)",
        "    at Socket.emit (events.js:203:15)",
        "    at Socket.EventEmitter.emit (domain.js:448:20)",
        "    at endReadableNT (_stream_readable.js:1143:12)",
        "    at process._tickCallback (internal/process/next_tick.js:63:19)"
    ]
}

Я провел некоторое исследование и обнаружил, что эта ошибка генерируется MySql. Однако ошибка возникает во время выполнения сценариев, которые даже никак не взаимодействуют с MySQL.

Я создал оболочку для MySQL, чтобы пообещать некоторые из ее функций. Ниже приведен код:

const util = require('util');

let lib = {
  'mySqlWrapper': (config) => {
    if (!config) {
      config = {
        host: process.env.MYSQL_HOST,
        port: process.env.MYSQL_PORT,
        user: process.env.MYSQL_USERNAME,
        password: process.env.MYSQL_PASSWORD,
        database: process.env.MYSQL_DB_NAME,
        timezone: 'utc'
      }
    };
    let connection = require("mysql").createConnection(config);
    return {
      query(sql, args) {
        return util.promisify(connection.query).call(connection, sql, args);
      },
      close() {
        return util.promisify(connection.end).call(connection);
      },
      beginTransaction() {
        return util.promisify(connection.beginTransaction).call(connection);
      },
      commit() {
        return util.promisify(connection.commit).call(connection);
      },
      rollback() {
        return util.promisify(connection.rollback).call(connection);
      }
    };
  }
}

module.exports = lib;

Обратите внимание, что я уверен, что каждое соединение создается при выполнении сценария и закрывается до его завершения.

Более того, я изменил несколько таймаутов для базы данных следующим образом:

Name                      Value
connect_timeout             5
delayed_insert_timeout      5
lock_wait_timeout           10
wait_timeout                5

Я не понимаю причину этой ошибки, особенно потому, что она происходит совершенно случайно (не все время), и даже во время выполнения сценариев, которые не имеют ничего общего с MySQL. Может ли кто-нибудь помочь мне найти вероятную причину этого?

1 Ответ

1 голос
/ 24 января 2020

Трудно сказать, не видя полной функции. Но чтобы было ясно, вы закрываете соединение в конце своей функции? Вы устанавливаете соединение вне своей функции обработчика? Если так, то он может сохраняться между вызовами функций на той же машине. У вас есть журналы на вашем mysql сервере, которые вы можете проверить?

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