Пытаться понять / улучшить причину холодного запуска облачной функции - PullRequest
2 голосов
/ 04 мая 2020

Я работаю с облачными функциями 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);

1 Ответ

1 голос
/ 06 мая 2020

Поскольку облачные функции не сохраняют состояния, среда выполнения часто инициализируется с нуля, поэтому вы увидите холодный запуск. Может быть полезно просмотреть Советы и рекомендации по облачным функциям . Кроме того, вы можете посмотреть это информативное видео, сделанное командой Firebase о минимизации времени холодного запуска , которое в основном объясняет, что минимизация объема работы, выполняемой вашей функцией в глобальной области видимости для всего импортируемого кода, как прямо, так и косвенно, является ключом к минимизации холодных запусков.

Вы также можете периодически пытаться пинговать функцию, чтобы минимизировать время холодного запуска. Эта страница может быть полезна для этого, но она немного устарела, поэтому вам может потребоваться провести дальнейшие исследования, чтобы выяснить, как лучше всего сделать это прямо сейчас.

Однако, если холодные запуски невыносимы, вы можете рассмотреть возможность запуска собственных экземпляров сервера, используя что-то вроде App Engine .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...