关闭Mongoose连接Lambda

man*_*umx 2 mongoose mongodb node.js aws-lambda

我在Amazon Web Services中使用Lambda函数发现了一种奇怪的行为.

我正在使用Node 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');
};
Run Code Online (Sandbox Code Playgroud)

这段代码没有问题.

现在......让我们尝试关闭连接.(哈哈)

我在ifs的任何情况下都使用它,在if的结尾,在if函数里面的if之后等等.

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();
    });
}
Run Code Online (Sandbox Code Playgroud)

在每一个案例中.Lambda函数永远不会返回错误,只返回NULL.

任何人都有一些线索为什么在Lambda中这种行为?在本地模式下,此行为从未发生在我之前.

如果我删除close指令,lambda函数将从我的Mongo服务器返回数据

请提前

man*_*umx 6

我发现了这个问题.

问题在于背景.和回调.我更改代码以在处理程序中包含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();
        });
    });
};
Run Code Online (Sandbox Code Playgroud)

希望有人发现这个有用.

  • 我知道我迟到了 5 年,但也许有人会发现我的评论有帮助。所以我想注意到,在此解决方案中,您将针对每个请求创建连接,并且不要重用已建立的连接。问题是每次 lambda 调用都会产生巨大的连接时间开销。最佳实践是将连接置于处理程序之外,并尝试重用它。 (2认同)