2016-05-17 20 views
1

Amazon Web Servicesでラムダ関数を使用すると、奇妙な動作が検出されました。閉じるMongoose connection Lambdaを閉じる

私はアイデアがテストし、ラムダの能力を再生することです4.3とマングース4.4.17

ノードを使用しています。

私は単純なモデルを作成し、それを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(); 
    }); 
} 

の終わりに、IFSのいずれの場合にもこれを使用します。ラムダ関数は決してエラーを返さず、NULLだけを返します。

誰もがラムダでこの現象をなぜ知っていますか?ローカルモードでは、この動作は以前は私には起こりませんでした。私は近くに命令を削除した場合

は、ラムダ関数は、私は問題を発見し、事前

答えて

3

で私はMongoサーバ

Thksからデータを返します。

問題はコンテキストです。そしてコールバック。ハンドラの中に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(); 
     }); 
    }); 
}; 

希望があれば、

関連する問題