【发布时间】:2020-05-04 14:27:36
【问题描述】:
我正在使用 firebase 云功能,在撰写本文时,我正在了解它们的最新依赖项和节点版本:
"engines": {
"node": "10"
},
"dependencies": {
"firebase-admin": "8.11.0",
"firebase-functions": "3.6.1"
}
我没有使用任何外部软件包,有 1 个功能仅使用 firebase 自己的服务,但收到的冷启动时间为 9-15 秒(从 firebase 日志中获取的时间),我真的不知道为什么。此外,从我的测试中,我看到以下行为:我调用我的函数,它以 11 秒的延迟开始。一段时间后(不到一分钟)我再次调用它,它以 9 秒的延迟开始,只有在第 3 次和更多的调用中,我开始看到 500 毫秒 - 600 毫秒的正常开始时间
下面是我的函数,我很想听听任何关于改进冷启动的建议或想法(函数是用打字稿写的)
index.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);
【问题讨论】:
标签: typescript firebase google-cloud-functions