簡體   English   中英

AWS Lambda - Mongoose 連接超時

[英]AWS Lambda - Mongoose connection timeout

我正在嘗試為 AWS Lambdas 重用 mongodb 連接,這是我的連接功能:

const openMongodbConnection = ({ config }) => (
  process.mongoConnection ? Promise.resolve() : mongoose.connect(config.MONGO_URL, {
    bufferCommands: false,
    bufferMaxEntries: 0,
    keepAlive: true,
  })

  .then((connection) => {
    process.mongoConnection = connection;
    return Promise.resolve();
  }, err => (
    Promise.reject({
      statusCode: 500,
      errorCode: [{
        code: 'DatabaseError',
        description: `unable to connect to mongo db: ${err} ${JSON.stringify(config)}`,
      }],
    })
  ))
);

數據庫位於 AWS VPC 內,沒有外部訪問權限。 冷啟動工作完美,但有時我會收到這樣的超時錯誤:

2018-10-03T18:36:06.984Z    7ab97df7-c739-11e8-89bf-87260b172585    MongoNetworkError: connection 2 to some.ip.from.server:27017 timed out
at Socket.<anonymous> (/var/task/node_modules/mongodb-core/lib/connection/connection.js:258:7)
at Socket.g (events.js:292:16)
at emitNone (events.js:86:13)
at Socket.emit (events.js:185:7)
at Socket._onTimeout (net.js:338:8)
at ontimeout (timers.js:386:14)
at tryOnTimeout (timers.js:250:5)
at Timer.listOnTimeout (timers.js:214:5)

我也有context.callbackWaitsForEmptyEventLoop = false; 就在函數的開頭。

這個錯誤是完全隨機的,有時有效,有時無效,我正在考慮每次出現新請求時打開和關閉連接,但我知道這會降低 lambdas 的性能,也會增加 I/O 操作來自 mongodb 服務器。

幫助將不勝感激。

好吧,我來這里尋找自己的答案..無論如何,我們到目前為止找到的唯一答案是每次調用lambda時打開和關閉數據庫連接。

顯然,當lambda不工作時,AWS會暫停進程,這意味着套接字看起來已經死了mongodb服務器,因此它會丟棄連接,因為它認為它是一個死客戶端。 因此,嘗試在lambda調用之間保持套接字會導致此超時。

問題是當lambda函數從AWS Fargate觸發時。

當AWS使用IAMRole:PassRole時,它會制動VPC / Subnet配置,從而使lambda函數無法連接到mongo數據庫。

我們也遇到過同樣的問題。 事實證明,我們的問題主要是在處理程序函數之外建立連接 .connection 在沒有實際調用處理程序函數的情況下被打開,並且只需要lambda.js文件。

當我們將連接代碼移到處理程序函數中時,問題就消失了:

// lambda.js

// DO NOT open mongodb connection here


exports.handler = async (event, context) => {
    // open the mongo connection here
    // openMongodbConnection()
}

我不確定這會如何導致問題,但這可能與將應用子網配置的順序有關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM