Повторное использование Mysql Соединение в Lambda на AWS - PullRequest
1 голос
/ 03 февраля 2020

У меня много лямбда-вызовов, и я всегда запрашиваю базу данных, поэтому я хочу, чтобы моя лямбда могла повторно использовать соединение , поэтому я устанавливаю соединение в конструкторе, например:

let mysqlConnection = mysql.createConnection({
  host: process.env.HOST,
  user: process.env.DB_USER,
  password: process.env.BDB_PWD,
  port: process.env.DB_PORT,
  database: process.env.DB_NAME
});

dbConn.connect(function(err) {
  if (err) {
    throw new Error('Error during connecting to db');
  } else {
    console.log("Database is connected");
  }
});

И у меня callbackWaitsForEmptyEventL oop установлен в false в моем обработчике:

exports.handler = (event, context) => {
  context.callbackWaitsForEmptyEventLoop = false;
  event.Records.forEach(record => {
   processEvent(JSON.parse(record.body), context);
  });
 };

Когда не удается установить mysql, я уничтожаю mysql соединение, мой запрос в Функция convertssEvent выглядит следующим образом:

  mysqlConnection.query(sql, values, function (err, rows) {
    if (err) {
      mysqlConnection.destroy();
      context.fail();
    } 
  }

Но время от времени я получаю лямбда-ошибки. Я думаю, иногда лямбда хочет повторно использовать соединение, которое недоступно.

 "Error: Error during connecting to db",
    "    at Handshake.<anonymous> (/var/task/lambda.js:34:13)",
    "    at Handshake.<anonymous> (/var/task/node_modules/mysql/lib/Connection.js:525:10)",
    "    at Handshake._callback (/var/task/node_modules/mysql/lib/Connection.js:491:16)",
    "    at Handshake.Sequence.end (/var/task/node_modules/mysql/lib/protocol/sequences/Sequence.js:83:24)",
    "    at Protocol.handleNetworkError (/var/task/node_modules/mysql/lib/protocol/Protocol.js:369:14)",
    "    at Connection._handleNetworkError (/var/task/node_modules/mysql/lib/Connection.js:421:18)",
    "    at Connection._handleConnectTimeout (/var/task/node_modules/mysql/lib/Connection.js:417:8)",
    "    at Object.onceWrapper (events.js:286:20)",
    "    at Socket.emit (events.js:198:13)",
    "    at Socket.EventEmitter.emit (domain.js:448:20)"

Что я могу сделать, чтобы предотвратить эту ситуацию? Или я должен разрушить соединение и подключиться еще раз?

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

Я нашел этот полезный инструмент, который может вам помочь, https://github.com/jeremydaly/serverless-mysql, вам нужно просто установить модуль npm и настроить его. Проверьте также раздел # connection-backoff.

0 голосов
/ 03 февраля 2020

Я не использую MySQL, но Mongodb в некоторых проектах. callbackWaitsForEmptyEventLoop была справка.

'use strict';

const mysql = require('mysql'); // require mysql

// If 'client' variable doesn't exist
if (typeof client === 'undefined') {
  // Connect to the MySQL database
  var client = mysql.createConnection({
    // your connection info
  });

  client.connect()
}

module.exports.handler = (event, context, callback) => {
  // This will allow us to freeze open connections to a database
  context.callbackWaitsForEmptyEventLoop = false;

  client.query('SELECT * FROM `books`', function (error, results) {
    callback(null, results)
  });
}

См. AWS документ и это руководство

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