Я делаю локальный симулятор для AWS Lambda, где можно установить context.callbackWaitsForEmptyEventLoop = false;
- это позволяет запускать лямбду без отключения от базы данных .Это используется для того, чтобы Lambda-соединения оставались открытыми на MongoDB, RethinkDB и т. Д.
Я хотел бы подчеркнуть, что Я знаю, что обычная, не лямбда-функция, которая здесь делается,отключить базу данных .Однако более низкая задержка с использованием callbackWaitsForEmptyEventLoop
делает его предпочтительным для Lambdas, поскольку он позволяет микровому компьютеру оставаться подключенным к базе данных, а для последующих лямбд - повторно использовать то же соединение.
Я хотел бы смоделировать AWSПоведение локально.
Как создать эквивалент callbackWaitsForEmptyEventLoop
= false (т. Е. Выйти, как только будет завершена вся обработка, а не ждать, пока цикл событий будет пустым?
Вот некоторый демонстрационный код. Измените FUNCTION_NAME
на 'connectOnly'
или 'connectAndDisconnect'
, чтобы продемонстрировать поведение.
Прямо сейчас 'connectAndDisconnect'
работает, но 'connectOnly'
- нет - он заканчивает обработку,но никогда не выйдет из узла, так как соединение все еще открыто.
let spawn = require('child_process').spawn
var log = console.log.bind(console)
let minify = script=> '"' + script.replace(/\n/g, '').trim() + '"'
var functions = {
connectAndDisconnect: `const rethinkdb = require('rethinkdb');
;(async function(request, context) {
var connection = await rethinkdb.connect({ host: 'localhost', port: 28015 });
await connection.close();
console.log('I connected successfully!');
})();`,
connectOnly: `const rethinkdb = require('rethinkdb');
;(async function(request, context) {
var connection = await rethinkdb.connect({ host: 'localhost', port: 28015 });
console.log('I connected successfully!');
})();`
}
const FUNCTION_NAME = 'connectOnly'
log(`Testing ${FUNCTION_NAME}`)
var functionToTest = functions[FUNCTION_NAME]
var child = spawn('node', ['-e', minify(functionToTest)], {
shell: true,
stdio: [0, 'pipe', 'pipe'],
cwd: 'C:\\Users\\mikem\\OneDrive\\Documents\\appless\\documentdb-arc-test\\src\\http\\get-index',
env: {}
})
var completed = false;
let timeout = 5000;
// bake a timeout
setTimeout(function () {
log(`Timed out after ${timeout} ms!`)
child.kill()
}, timeout)
// 'close' will occur if the process finishes naturally
// 'exit' will occur if the process is killed
console.log(`What we want is to be see a 'close' event using the 'connectOnly' code above`)
;['close', 'exit'].forEach(function(event){
child.on(event, function () {
log(`'${event}' event happened!`)
if ( ! completed ) {
completed = true
log(`Done!`)
}
})
})