AWS Lambda(Node.js,v.8.10)&猫鼬:MongoNetworkError与数据库的连接超时 [英] AWS Lambda (Node.js, v. 8.10) & Mongoose: MongoNetworkError connection to DB timed out

查看:124
本文介绍了AWS Lambda(Node.js,v.8.10)&猫鼬:MongoNetworkError与数据库的连接超时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

环境:

  • AWS Lambda(Node.js,第8.10版),waitForEmptyEventLoop === false
  • MongoDB(地图集)
  • 猫鼬

问题:有时(随机)出现下一个错误:

Problem: sometimes (randomly) I get next error:

MongoNetworkError: connection 6 to db_host:27017 timed out
  File "/opt/nodejs/node_modules/mongodb-core/lib/connection/connection.js", line 259, col 7, in TLSSocket.<anonymous>
    new MongoNetworkError(f('connection %s to %s:%s timed out', self.id, self.host, self.port)),
  File "events.js", line 313, col 30, in Object.onceWrapper
  File "events.js", line 106, col 13, in emitNone
  File "events.js", line 208, col 7, in TLSSocket.emit
  File "net.js", line 420, col 8, in TLSSocket.Socket._onTimeout
  File "timers.js", line 482, col 11, in ontimeout
  File "timers.js", line 317, col 5, in tryOnTimeout
  File "timers.js", line 277, col 5, in Timer.listOnTimeout

数据库连接代码:

const mongoose = require('mongoose');
const log = require('./log');

const options = {
  reconnectTries: 30,
  reconnectInterval: 500,
  poolSize: Number(process.env.DB_POOLSIZE) || 1,
  socketTimeoutMS: 30000,
  keepAlive: true,
  bufferCommands: false,
  bufferMaxEntries: 0,
};

let isConnected;

module.exports.connect = () => new Promise((resolve, reject) => {
  if (isConnected) {
    return resolve();
  }

  return mongoose.connect(process.env.DB_URI, options)
    .then((db) => {
      isConnected = db.connections[0].readyState;
      resolve();
    }).catch((error) => {
      log.error('DB:', error);
      reject(error);
    });
});

我已经检查过-isConnected已成功缓存,mongodb连接已缓存在mongoose中.一切都可以,但有时我会收到此错误.

I've checked - isConnected cached successfully, mongodb connection cached in mongoose. All must be okay, but sometimes I get this error.

任何人都知道如何解决此问题?

Anybody have any ideas how can I solve this issue?

推荐答案

只需增加socketTimeoutMS-对我来说就足够2000000,以保持lambda调用暖"容器之间的连接. 使用下一个配置(猫鼬):

Just increase socketTimeoutMS - for me 2000000 enough to keep connection between lambdas invocation of "warm" container. Use next config (mongoose):

 { reconnectTries: 30, reconnectInterval: 500, poolSize: 1, socketTimeoutMS: 2000000, keepAlive: true, }

另一个变体(smbd将此视为最佳实践)-为每个lambda调用创建/关闭连接.如果您知道lambda很少被调用,这是一个好主意

Another variant (smbd treat this as best practice) - create/close connection for each lambda invocation. Not bad idea if you know that lambda will invoked rarely

这篇关于AWS Lambda(Node.js,v.8.10)&amp;猫鼬:MongoNetworkError与数据库的连接超时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆