Рассмотрим следующую функцию AWS Lambda:AWS Lambda срок службы Функция
var i = 0;
exports.handler = function (event, context) {
context.succeed(++i);
};
Выполнение этой функции несколько раз, я в конечном итоге с выходом аналогично, как следующее:
> 0
> 1
> 2
> 0
> 1
> 0
> 3
> 2
> 4
> 1
> 2
Как вы можете видеть, кажется, что есть три синглтона скрипта, и я случайно попадал в один из них, когда выполняю функцию.
Является ли это ожидаемым поведением? Я не нашел никакой информации о документации.
Я спрашиваю это потому, что я намерен подключиться к MySQL и сохранить пул соединений:
var MySQL = require('mysql');
var connectionPool = MySQL.createPool({
connectionLimit: 10,
host: '*****',
user: '*****',
pass: '*****',
database: '*****'
});
function logError (err, callback) {
console.error(err);
callback('Unable to perform operation');
}
exports.handler = function (event, context) {
connectionPool.getConnection(function (err, connection) {
err && logError(err, context.fail);
connection.query('CALL someSP(?)', [event.user_id], function (err, data) {
err && logError(err, context.fail);
context.succeed(data[0]);
connection.release();
});
});
};
Подключение бассейна должна быть утилизированы с помощью connectionPool.end()
, но где я должен выполнить это?
Если я добавлю его в конце скрипта (после обработчика), пул соединений будет закрыт сразу же после выполнения первой функции лямбда.
Если я удаляю пул соединений внутри обработчика, пул соединений будет закрыт для будущих запросов.
Кроме того, Должен ли я его распорядиться? Если я его не уничтожу, соединения будут храниться в пуле и в памяти, но, как вы видели в первом примере кода, AWS хранит ~ 3 синглтона моего модуля, это будет означать, что я закончил бы с 3 разных пула соединений, по 10 подключений.
но когда экземпляр завершится Lambda из-за простоя, connection.end() не будет вызван? Будет ли это проблемой утечки, потому что мы не можем предсказать, когда экземпляр завершит и освободит объекты соединения. – Nick
@Nick Соединение должно завершиться, так как процесс завершается.Это только утечка, если процесс продолжает работать. Вопрос в том, обрабатывает ли mysql сокет, повесившийся на другом конце сообщения изящно. –