我正在使用firebase云函数,在撰写本文时,我正在研究它们的最新依赖项和节点版本:
"engines": {
"node": "10"
},
"dependencies": {
"firebase-admin": "8.11.0",
"firebase-functions": "3.6.1"
}
我没有使用任何外部包,有一个功能只使用firebase自己的服务,但我收到的冷启动时间从9-15秒不等(从firebase日志中获取的时间(,我真的不知道为什么。此外,从我的测试中,我看到了以下行为:我调用我的函数,它以11s的延迟开始。一段时间后(不到一分钟(我再次呼叫它,它以9秒的延迟开始,只有在第三次和更多的呼叫中,我开始看到500毫秒-600毫秒的正常开始时间
以下是我有问题的函数,我很想听听关于改进冷启动的任何建议或想法(函数是用打字稿写的(
指数.ts
import admin from 'firebase-admin';
admin.initializeApp();
exports.createCharacter = require('./api/createCharacter');
下面是我的主要功能,乍一看它似乎很冗长,但据我所知,它并没有做任何疯狂的事情。它的依赖项validCreateCharacter
是一个基本函数,只有很少的if
语句来检查字符串的长度并确保输入对象具有所需的字段,如果出现问题,它会抛出firebases http错误。
api/createCharacter.ts
import { CreateCharacter } from '$types/functions';
import { auth, firestore } from 'firebase-admin';
import { https } from 'firebase-functions';
import { validCreateCharacter } from '../util/validation';
/**
* Function
*/
async function createCharacter(
input: CreateCharacter['input'],
context: https.CallableContext
): Promise<CreateCharacter['output']> {
const uid = context?.auth?.uid;
if (!uid) {
throw new https.HttpsError('unauthenticated', 'Authentication required');
}
try {
validCreateCharacter(input);
const { username } = input;
const characterRef = firestore().doc(`characters/${uid}`);
const characterSecretRef = firestore().doc(`characters/${uid}/secret/${uid}`);
const usernameRef = firestore().doc(`usernames/${username}`);
const characterData = input;
const characterSecretData = { gold: 1000, items: [] };
const batch = firestore().batch();
batch.create(characterRef, characterData);
batch.create(characterSecretRef, characterSecretData);
batch.create(usernameRef, { uid });
try {
await batch.commit();
await auth().setCustomUserClaims(uid, { character: true });
} catch {
throw new https.HttpsError('already-exists', 'Username is taken');
}
return true;
} catch (error) {
throw new https.HttpsError('unknown', error?.message);
}
}
/**
* Export
*/
module.exports = runWith({ timeoutSeconds: 15, memory: "128MB" }).region('europe-west2').https.onCall(createCharacter);
因为云函数是无状态的,执行环境通常是从头开始初始化的,所以您会看到冷启动。复习Tips&云函数的技巧。此外,您可能想看看Firebase团队制作的这段关于最小化冷启动时间的信息视频,该视频基本上解释了最小化您的函数在全局范围内为所有直接和间接导入的代码执行的工作量是最小化冷启动的关键。
您也可以尝试定期ping该函数,以尽量减少冷启动时间。这个页面可能对此有所帮助,但它有点过时了,所以你可能需要做一些进一步的研究,以找出现在最好的方法。
然而,如果冷启动令人难以忍受,您可能需要考虑使用App Engine之类的软件来运行自己的服务器实例。