2016-05-17 3 views
1

Я нашел странное поведение, используя функцию Lambda в веб-сервисах Amazon.Close Mongoose connection Lambda

Я использую узел 4.3 и Mongoose 4.4.17

Идея заключается в том, чтобы проверить и играть с возможностями Lambda.

Я делаю простую модель, и я храню ее в экземпляре Ec2. Код работает нормально, пока я не попытаюсь закрыть соединение. Я знаю, лучшие практики говорят: «Не закрывайте соединение, пусть пул ручка». Ну, это применимо в обычном приложении, но Lambda - это функция без состояния, поэтому, если я не закрываю соединение, это держит открытым, потребляя ресурсы. И это может быть очень плохо, если у вас тысячи запросов в секунду.

Итак, это мой код.

'use strict'; 
let mongoose = require('mongoose'); 
//I add this options, because this close my connections 
//faster than the 30 min by default 
let options = { server: { socketOptions: { keepAlive: 30000, connectTimeoutMS: 30000 } }}; 
let db = mongoose.createConnection('mongodb://myInternalServerEC2:27017/myDB', options); 
let Schema = require('mongoose').Schema; 
let TempSchema =new Schema({name:{type:String,required:true}}); 
//This is a copy paste from an another project, 
//but i can remove, but i don't think this has nothing 
//with my problem. 
personSchema.set('autoIndex', false); 
personSchema.index({name:1}); 

let tempDB = db.model('tempcol', TempSchema); 
exports.handler = (event, context, callback) => { 
    tempDB.find(function (err, data) { 
     if (typeof(data) === 'object' && data.length === 0) { 
      data = null; 
     } 
     if (!err && data !== null) { 
      callback(null, data); 
     } else if (!err) { 
      error = new Error("No data found"); 
      callback(error); 
     } else { 
      callback(err); 
     } 
    }).populate('_typeId'); 
}; 

Этот код работает без проблем.

Теперь ... позволяет попытаться закрыть соединение. (Ха)

Я использую это в любом случае КСФ, в конце, если, после того, если внутри функции поиска и т.д.

db.close(); 
callback(null, data); 

mongoose.disconnect(); 
callback('Some error');  

//This finish inside the find function 

finish(db, function(){ 
    callback(error, data); 
}); 
// A finish function with a callback, 
// so i can call the parent callback 
function finish(db, cb){ 
    db.close(function(){ 
     cb(); 
    }); 
} 

В каждом отдельном случае. Функция Lambda никогда не возвращает ошибку, возвращает NULL.

У кого-нибудь есть подсказка, почему это поведение в Лямбде? В локальном режиме это поведение никогда не случается со мной раньше.

Если я удалить тесную инструкцию, то лямбда-функция возвращает данные из моего Монго сервера

Thks заранее

ответ

3

Я нашел проблему.

Проблема заключается в контексте. И обратные вызовы. Я изменяю код, чтобы включить событие createConnection внутри обработчика.

https://aws.amazon.com/es/blogs/compute/getting-nodejs-and-lambda-to-play-nicely/

Этот код работает.

'use strict'; 
let mongoose = require('mongoose'); 
let options = { server: { socketOptions: { keepAlive: 30000, connectTimeoutMS: 30000 } }}; 

let Schema = require('mongoose').Schema; 
let TempSchema =new Schema({name:{type:String,required:true}}); 
TempSchema.set('autoIndex', false); 
TempSchema.index({name:1}); 


exports.handler = (event, context) => { 
    let db = mongoose.createConnection('mongodb://myInternalServerEC2:27017/myDB', options); 
    let tempDB = db.model('tempcol', TempSchema); 

    function closeBD(cbk){ 
     console.log("Close BD"); 
     db.close(function(){ 
      cbk(); 
     }); 
    } 
    tempDB.find(function (err, data) { 
     if (typeof(data) === 'object' && data.length === 0) { 
      data = null; 
     } 
     if (!err && data !== null) { 
      context.succeed(data); 
     } else if (!err) { 
      let error = new Error("No data found"); 
      context.fail(error); 
     } else { 
      context.fail(err); 
     } 
     closeBD(function(){ 
      context.done(); 
     }); 
    }); 
}; 

Надеюсь, что кто-то найдет это полезным.