【问题标题】:Trying to understand / improve cause of cloud function cold start试图了解/改善云功能冷启动的原因
【发布时间】: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


    【解决方案1】:

    由于 Cloud Functions 是无状态的,执行环境通常是从头开始初始化的,因此您会看到冷启动。查看Tips & Tricks For Cloud Functions 可能会有所帮助。此外,您可能还想查看 Firebase 团队制作的关于 Minimizing Cold Start Time 的内容丰富的视频,该视频基本上解释了将您的函数在全局范围内为所有直接和间接导入的代码执行的工作量最小化是减少冷启动的关键。

    您还可以尝试定期 ping 该功能以最大限度地减少冷启动时间。 This Page 可能对此有所帮助,但它有点过时了,因此您可能需要做一些进一步的研究来找出现在最好的方法。

    但是,如果冷启动难以忍受,您可能需要考虑使用类似App Engine 的方式运行自己的服务器实例。

    【讨论】:

      猜你喜欢
      • 2020-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 2019-07-15
      • 1970-01-01
      • 2021-01-02
      • 1970-01-01
      相关资源
      最近更新 更多