Я работаю с облачными функциями firebase, и на момент написания статьи я нахожусь на их последних зависимостях и версии узла:
"engines": {
"node": "10"
},
"dependencies": {
"firebase-admin": "8.11.0",
"firebase-functions": "3.6.1"
}
Я не использую никаких внешних пакетов, у меня есть 1 функция, которая использует только firebase's собственные службы, но я получаю время холодного запуска в диапазоне от 9-15 секунд (время взято из журналов Firebase), и я действительно не уверен, почему. Кроме того, из моих тестов я вижу следующее поведение: я вызываю свою функцию, она начинается с задержкой 11 с. Я вызываю его снова через некоторое время (менее минуты), он начинается с задержкой 9 с, только при 3-м и более вызовах я начинаю видеть нормальное время начала 500 мс - 600 мс
Ниже описана моя функция и Я хотел бы услышать любые предложения или идеи по улучшению холодных запусков (функция написана в машинописи)
index.ts
import admin from 'firebase-admin';
admin.initializeApp();
exports.createCharacter = require('./api/createCharacter');
Ниже моя основная функция, на первый взгляд кажется многословным, но насколько я могу судить, он не делает ничего сумасшедшего. Это зависимость validCreateCharacter
- это базовая c функция с несколькими операторами if
, проверяющими длины строк и проверяющими наличие у обязательных полей входного объекта, а затем, если что-то не так, выдает http-ошибку firebases.
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);