【问题标题】:Mongo connection occasionally makes the lambda function timeoutMongo 连接偶尔会使 lambda 函数超时
【发布时间】:2018-03-03 15:21:03
【问题描述】:

我一直在使用 MLab MongoDB 和 mongoose 库在无服务器 (Lambda) 处理程序中创建数据库连接。它可以在本地机器上顺利运行。但有时部署后不起作用。请求返回Internal server error。奇怪的是有时它会起作用。但是如果我删除数据库连接代码,处理程序就会工作。无服务器日志只是说Process exited before completing request。没有真正的错误,所以不知道该怎么做。

数据库连接如下所示: handler.js

// Connect to database
mongoose.connect(process.env.DATABASE_URL, {
  useMongoClient: false
}).then((ee) => {
  console.log('------------------------invoke db ', ee);
})
  .catch(err => console.error('-----------error db ', err));

这里也没有错误。知道发生了什么吗?

【问题讨论】:

  • 增加超时时间,添加X射线追踪,找出哪个位慢。然后lambda变温后,再看trace。
  • @TrentBartlem 仍然没有帮助:-(

标签: mongodb lambda aws-lambda serverless-framework serverless-architecture


【解决方案1】:

当您得到Process exited before completing request 时,这意味着node 进程在Lambda 能够调用callback 之前已经崩溃。如果您转到 Cloudwatch 日志,则会出现错误和所发生的堆栈跟踪。

您应该在您的处理程序中连接到 MongoDB 实例,在您调用 callback() 之前,请先断开连接。

应该是这样的……

exports.handler = (event, context, callback) => {
  let response;

  return mongoose.connect(process.env.DATABASE_URL, {
    useMongoClient: false
  }).then((ee) => {
    // prepare your response
    response = { hello: 'world' }
  }).then(() => {
    mongoose.disconnect()
  }).then(() => {
    // Success
    callback(null, response)
  }).catch((err) => {
    console.error(err);

    callback(err);
  })
};

【讨论】:

  • 连接不应在处理程序内部,使用后也不应断开(通常)。
【解决方案2】:

这里是article,详细解释了 lambda 如何与节点一起工作,以及如何实现数据库连接的示例。 与@dashmug 建议的不同,您不应该断开您的数据库,因为每次连接都会降低您的性能。

【讨论】:

    猜你喜欢
    • 2021-02-14
    • 2017-03-13
    • 1970-01-01
    • 2019-03-22
    • 2017-03-09
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多