我正在尝试将我的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连接?我是无服务器的新手所以我想我对我的功能是否在执行期间启动并保持运行感到困惑,然后在闲置后“关闭”。
如果需要,可以提供实时链接。
答案 0 :(得分:2)
第一次在新实例中执行函数时,它必须连接到Mongo服务器。
这意味着重新连接至少会发生:
如果您的客户端库执行连接管理,它也可能在中间发生。但由于这并不依赖于云功能环境,我无法对其进行评论。