Google Cloud Functions是否针对每个HTTP请求重新连接到我的MongoDB客户端?

问题描述 投票:1回答:1

我正在尝试将我的Node / Express REST API迁移到Google Cloud Functions,并注意到一些性能问题。我在所有API路由上收到404错误,同时等待我的函数在一段时间不活动后“旋转”。我很好奇这是否与我的实施有关。这是我的Express无服务器“服务器”,用Typescript(index.ts)编写:

import * as functions from 'firebase-functions'
import * as express from 'express'
import { MyApi } from './server'

const app: express.Application = MyApi.bootstrap().app

export const myApp = functions.https.onRequest(app)

接下来,这是server.ts

import * as express from 'express'
import * as mongodb from 'mongodb'

require('dotenv').config({ path: '.env' })

export class MyApi {
  app: express.Application = express()
  mongoDbUri: string = process.env.MONGO_URI

  static bootstrap(): MyApi {
    return new MyApi()
  }

  constructor() {
    this.connectToDb(this.mongoDbUri)
  }

  connectToDb(uri: string) {
    mongodb.MongoClient.connect(uri, (err, db) => {
      if (err) {
        this.handleNoDbError(err)
      }
      setApiRoutes(app: express.Application, db)
    })
  }
}

为了简单起见,我删除了很多冗余代码,但希望这足以让你理解。我要求函数公开一些API端点。首先,我使用连接池来建立单个Mongo连接,然后将该连接(db)传递给我的路由。这些路由端点反过来向我的MongoDB Atlas数据库发出find()请求,并将这些结果传递给我的应用程序。

我部署了此代码的一个版本,它运行正常,因为它可以正确获取结果。但是我担心性能下降和间歇性404错误(例如,与Heroku上的专用Node / Express服务器相比)。

我想知道我的问题是否与Mongo客户端有关。每次向函数发出请求时它是否连接到我的数据库?一旦我的函数在不活动后唤醒,它们是否会在未来的所有请求中保持相同的Mongo DB连接?我是无服务器的新手所以我想我很困惑我的功能是否在执行期间启动并保持运行,然后在空闲后“关闭”。

如果需要,可以提供实时链接。

mongodb firebase express google-cloud-platform google-cloud-functions
1个回答
2
投票

第一次在新实例中执行函数时,它必须连接到Mongo服务器。

这意味着重新连接至少会发生:

  • 经过一段时间的不活动后,如果云功能已经停止了您的实例。
  • 当活动增加时,Cloud Functions会旋转其他实例。

如果您的客户端库进行连接管理,它也可能在中间发生。但由于这不依赖于云功能环境,我无法评论它。

© www.soinside.com 2019 - 2024. All rights reserved.