【问题标题】:Close Mongoose connection Lambda关闭 Mongoose 连接 Lambda
【发布时间】:2016-09-13 19:54:33
【问题描述】:

我在 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');
};

此代码可以正常工作。

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

我在 if 的任何情况下,在 if 的末尾,在 find 函数内的 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();
    });
}

在每一种情况下。 Lambda 函数从不返回错误,只返回 NULL。

任何人都知道为什么 Lambda 会出现这种行为?在本地模式下,这种行为以前从未发生在我身上。

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

提前考虑

【问题讨论】:

    标签: node.js mongodb mongoose aws-lambda


    【解决方案1】:

    我发现了问题。

    问题在于上下文。和回调。我将代码更改为在处理程序中包含 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();
            });
        });
    };
    

    希望有人觉得这很有用。

    【讨论】:

    • 我知道我迟到了 5 年,但也许有人会觉得我的评论很有帮助。所以我想注意到,在这个解决方案中,您将在每个请求上创建连接,并且不要重用已建立的连接。问题是每次 lambda 调用都有巨大的连接时间开销。最佳做法是将连接放在您的处理程序之外,并尝试重用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 2020-01-06
    • 2022-07-27
    • 1970-01-01
    相关资源
    最近更新 更多