2016-01-19 2 views
2

Рассмотрим следующую функцию 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 подключений.

ответ

4

Если я плохо неправильно понимаю ваш вопрос, это хорошо документированное и ожидаемое поведение для лямбда. См. Здесь: https://aws.amazon.com/lambda/faqs/

Lambda вращает экземпляры вашего контейнера в соответствии с шаблонами использования вашей лямбда-функции. Если он не используется в данный момент, он будет вращаться, если он будет использоваться сильно, тогда будет создано больше контейнеров. Вы никогда не должны зависеть от постоянного состояния в лямбда-функции. Хорошо использовать состояние, если оно для жизненного цикла вашей функции, или вы что-то оптимизируете.

Насколько я знаю, вы не можете контролировать количество экземпляров функций в памяти в любой момент времени, поэтому, если вас беспокоит использование ваших соединений mysql, вы должны соответствующим образом спроектировать.

Из документации:

«AWS Lambda может начаться как много копий вашей функции по мере необходимости без длительных развертывания и настройки задержек Там нет никаких принципиальных ограничений на масштабирование функции AWS Lambda будет динамически распределять мощность, чтобы соответствовать.. скорость входящих событий ».

Как применимо непосредственно к вашему вопросу mysql, я всегда буду возвращать ваше соединение с пулом, когда вы закончите его использовать. Затем я сделаю несколько расчетов о том, сколько параллельных запросов вы ожидаете иметь и планируете соответственно с конфигурацией сервера mysql.

+0

но когда экземпляр завершится Lambda из-за простоя, connection.end() не будет вызван? Будет ли это проблемой утечки, потому что мы не можем предсказать, когда экземпляр завершит и освободит объекты соединения. – Nick

+0

@Nick Соединение должно завершиться, так как процесс завершается.Это только утечка, если процесс продолжает работать. Вопрос в том, обрабатывает ли mysql сокет, повесившийся на другом конце сообщения изящно. –

Смежные вопросы