【发布时间】:2020-05-23 20:49:43
【问题描述】:
目前我正在开发一个使用 Firebase 作为后端的 Angular 8 应用程序。
我关注Jeff Delaney's Tutorial 并成功部署在名为 ssr my express server 的云功能上。
一切正常...几乎!部署 ssr 功能后,我可以看到所有云功能的内存使用量增加,即使是最小的(1 个事务具有 get 和 1 个事务中的更新):
functions/src/index.ts
// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
import * as functions from 'firebase-functions';
// The Firebase Admin SDK to access Firestore.
import * as admin from 'firebase-admin';
admin.initializeApp();
export const ssr = functions.https.onRequest(require(`${process.cwd()}/dist/server`).app);
export const unsubscribeToMeal = functions.region('europe-west1').https.onCall((data) => {
const mealDoc = admin.firestore().doc('meals/' + data.meal.uid);
const adminDoc = admin.firestore().doc('users/' + data.meal.adminId);
return admin.firestore().runTransaction(t => {
return t.get(mealDoc)
.then(doc => {
const meal = doc.data();
if (doc.exists && meal) {
const promises = [];
const participantIndex = meal.users.findIndex((element: any) => {
return element.detail.uid === data.userToUnsubscribe.uid;
});
meal.users.splice(participantIndex, 1);
const pendingRequest = meal.users.filter((user: any) => user.status === 'pending').length > 0;
const p4 = t.update(mealDoc, { 'users': meal.users, 'participantId': admin.firestore.FieldValue.arrayRemove(data.userToUnsubscribe.uid), 'nbRemainingPlaces': meal['nbRemainingPlaces'] + 1, 'pendingRequest': pendingRequest })
promises.push(p4);
if (promises.length > 0) {
return Promise.all(promises)
.then(() => console.log('user unsubscribed'))
.catch((err: any) => console.log('error unsubscribing user : ' + data.userToUnsubscribe.first_name + ' ' + data.userToUnsubscribe.last_name + ' of the meal ' + meal.uid + '. Err : ' + err))
}
else {
// doc.data() will be undefined in this case
throw new functions.https.HttpsError('not-found', 'no such document!');
}
} else {
// doc.data() will be undefined in this case
console.log('doc does not exist');
throw new functions.https.HttpsError('not-found', 'no such document!');
}
})
})
});
触发 unsubscribeToMeal 函数从没有部署 ssr 函数的 60MB 内存使用量到部署 ssr 函数的 240MB 内存使用量。
所以我想知道发生了什么?看起来 express 服务器应用程序是每个云功能实例上的引导程序,这会导致内存使用量增加并因此产生更多费用。
正如 Doug Stevenson 解释的 here,我将全局变量限制为最小化冷启动,所以不应该这样。
server.ts
(global as any).WebSocket = require('ws');
(global as any).XMLHttpRequest = require('xhr2');
import 'zone.js/dist/zone-node';
import 'reflect-metadata';
import { enableProdMode } from '@angular/core';
import * as express from 'express';
import { join } from 'path';
// Faster server renders w/ Prod mode (dev mode never needed)
enableProdMode();
// Express server
export const app = express();
import * as cookieParser from 'cookie-parser';
import { from } from 'rxjs';
app.use(cookieParser());
const PORT = process.env.PORT || 4000;
const DIST_FOLDER = join(process.cwd(), 'dist/browser');
// * NOTE :: leave this as require() since this file is built Dynamically from webpack
const { AppServerModuleNgFactory, LAZY_MODULE_MAP, ngExpressEngine, provideModuleMap } = require('./dist/server/main');
// Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine)
app.engine('html', ngExpressEngine({
bootstrap: AppServerModuleNgFactory,
providers: [
provideModuleMap(LAZY_MODULE_MAP)
]
}));
app.set('view engine', 'html');
app.set('views', DIST_FOLDER);
// Example Express Rest API endpoints
// app.get('/api/**', (req, res) => { });
// Serve static files from /browser
app.get('*.*', express.static(DIST_FOLDER, {
maxAge: '1y'
}));
// All regular routes use the Universal engine
app.get('*', (req: express.Request, res: express.Response) => {
res.render('index2', {
req
});
});
// Start up the Node server
app.listen(PORT, () => {
console.log(`Node Express server listening on http://localhost:${PORT}`);
});
任何解决方案仍然具有低内存使用率(不增加函数的内存限制)并且同时具有快速服务器的 ssr 函数用于角度通用?
【问题讨论】:
标签: angular firebase google-cloud-functions out-of-memory angular-universal