云功能(Firebase)-通过部分加载Firebase模块减少冷启动时间?

yoo*_*ung 5 javascript node.js firebase google-cloud-functions

Firebase文档建议明智地管理依赖关系,这是减少冷启动时间的第一件事:https : //firebase.google.com/docs/functions/tips#use_dependencies_wisely

对于大多数Firebase功能,您可能会使用firebase-functionsfirebase-admin模块。

这是一个实用的示例函数:

const functions = require('firebase-functions');
const admin = require('firebase-admin');

// Initialize the app in admin sdk
admin.initializeApp();

// Firestore timestamp support
admin.firestore().settings({timestampsInSnapshots: true});

exports.simpleFunction = functions.https.onCall((data, context) => {
    return admin.auth().getUserByEmail(data.email)
        .catch(() => {
            return Promise.reject(new https.HttpsError('not-found', 'User not found.'));
        })
        .then(userRecord => {
            return admin.firestore().collection('user').doc(userRecord.uid).get();
        })
});
Run Code Online (Sandbox Code Playgroud)

冷启动执行时间:Function execution took 7517 ms, finished with status code: 200 热启动时间:Function execution took 8 ms, finished with status code: 200

如图所示,对该功能的测试具有〜7.5秒的冷启动启动时间(尽管显着的热响应时间)。尽管有许多因素可以解释为什么会出现这种情况,但是一个原因可能是加载firebase-functions和所需的所有依赖项firebase-admin

假设示例函数在这两个程序包中仅使用了几种方法,是否有可能仅以某种方式加载这些方法及其相关性以减少加载时间?

我也尝试过直接使用Typescript和导入方法,import {https} from 'firebase-functions'import {initializeApp, firestore, auth} from 'firebase-admin'希望某种神奇的形式在后台摇摇欲坠,但事实证明,TypeScript最终被转换为javascript。

ajo*_*era 2

有一些策略可以减少 Firebase 功能的冷启动。你的策略是当场尝试减少依赖性。

GCF 冷启动性能的第一个贡献者是依赖性。

似乎不可能达到您想要的那种粒度。

我的建议是:

  • 尝试使用使用更广泛的库版本。依赖项缓存在所有 GCF 依赖项之间共享。谷歌的一个人有一篇关于这个主题的非常好的文章。一探究竟。另外还有视频版

  • 对依赖项使用延迟加载。Firebase 成员 @DougStevenson有一段精彩的视频解释了这一策略。他还给出了使用打字稿的示例。

  • 避免崩溃。如果您的功能崩溃,可能会增加冷启动。