Я использую пакет mysql2 с Express Framework, развернутый через AWS Lamda. У меня есть подготовленный параллелизм, установленный на 3 для Aws Lambda.
Я не подключаюсь напрямую к MySQL. У меня есть прокси-сервер RDS между ними.
Я получаю следующую ошибку, случайным образом.
{
"errorType": "Error",
"errorMessage": "connect ETIMEDOUT",
"code": "ETIMEDOUT",
"errorno": "ETIMEDOUT",
"syscall": "connect",
"fatal": true,
"stack": [
"Error: connect ETIMEDOUT",
" at Connection._handleTimeoutError (/var/task/node_modules/mysql2/lib/connection.js:178:17)",
" at listOnTimeout (internal/timers.js:554:17)",
" at processTimers (internal/timers.js:497:7)"
]
}
Вот как выглядит мой код:
var AWS = require("aws-sdk");
const mysql = require('mysql2');
class DBConnection {
constructor() {
var signer = new AWS.RDS.Signer({
region: 'us-east-1',
hostname: process.env.DB_HOST,
port: 3306,
username: process.env.DB_USER
});
let connectionConfig = {
host: process.env.DB_HOST,
user: process.env.DB_USER,
database: process.env.DB_NAME,
ssl: 'Amazon RDS',
authPlugins: { mysql_clear_password: () => () => signer.getAuthToken() }
};
this.db = mysql.createConnection(connectionConfig);
}
query = async (sql, values) => {
return new Promise((resolve, reject) => {
this.db.execute(sql, values, (error, result) => {
if (error) {
reject(error);
return;
}
resolve(result);
});
});
}
}
module.exports = new DBConnection().query;
const results = await query('SELECT COUNT(*) AS total_listens FROM analytics WHERE event_name = "PLAYED"');
Любая подсказка, где проблема может быть?
С AWS Lambda function
лучше использовать mysql.createPool
вместо mysql.createconnection
. Я не знаю, в чем конкретная причина, но использование mysql.createconnection
вместо mysql.createPool
также вызвало у меня проблемы. Также необходимо release
соединение, когда запрос проходит успешно.
Я не очень уверен, но, похоже, поскольку это лямбда-функции, он создает экземпляр для каждого вызова, и вы не освобождаете свое соединение (уничтожаете соединение), когда меньше соединения (меньшее количество экземпляров лямбда-функции), он работает, когда одновременно активны несколько лямбда-выражений, время соединения истекает. попробуйте разорвать соединение по мере выполнения работы, я не уверен, как оно будет масштабироваться, хотя с огромным трафиком.