Firebase Admin SDK 在 Firebase 函数中冷启动时速度慢

Firebase Admin SDK slow on cold starts in Firebase Function

我在 Firebase Functions 中使用 Firebase Admin SDK 来列出云存储上目录的内容。然而,我的函数通常需要超过 5 秒的时间来回答。起初我认为这都是由于函数本身的冷启动造成的,我尝试了很多方法来防止函数冷启动,例如:

但是 none 上面的方法有效,并且在第一次调用该函数时我的响应时间仍然很慢。在函数中添加一些日志记录后,Admin SDK 需要超过一秒的时间才能从实时数据库中获取单个值,并且通常需要 5 秒以上才能执行 运行 getFiles 命令云存储(该目录通常只包含一个文件)。

例如,对于下面的代码,我得到以下控制台输出:

listVideos: coldstart true
listVideos: duration 1: 0ms
listVideos: duration 2: 1302ms (realtime database)
listVideos: duration 3: 6505ms (getFiles on cloud storage)
listVideos: coldstart false
listVideos: duration 1: 0ms
listVideos: duration 2: 96ms (realtime database)
listVideos: duration 3: 199ms (getFiles on cloud storage)

我的函数如下所示:

import * as admin from "firebase-admin";

admin.initializeApp();

let coldStart = true;
exports.listVideos = functions.region("europe-west1").runWith({
  memory: "128MB",
  minInstances: 1,
}).https.onCall(async (data, context) => {
  console.log("coldstart", coldStart);
  coldStart = false;
  const t1 = new Date().getTime();
  if (context.auth) {
    const authUid = context.auth.uid;

    console.log(`duration 1: ${new Date().getTime() - t1}ms`);
    const level = (await admin.database().ref(`users/${authUid}/`).once("value")).val();
    console.log(`duration 2: ${new Date().getTime() - t1}ms (realtime database)`);

    const [files] = await admin.storage().bucket()
        .getFiles({
          prefix: `${authUid}/video`,
        });
    console.log(`duration 3: ${new Date().getTime() - t1}ms (getFiles on cloud storage)`);
    return {status: "success", files: files};
  } else {
    return {status: "error - not authenticated"};
  }
});

我知道我不能期望有 0 毫秒的延迟,但是对于一个简单的 getFiles 调用,我期望不到 1 秒的时间,就像 sdk 处于“热”状态时一样(考虑到我的整个存储桶都有少于 1000 个文件,我列出的目录中只有 1 个文件)

Cloud Storage 不是数据库,也没有针对查询进行优化(getFiles 实际上是使用对象名称前缀对整个存储桶进行查询)。当您已经知道对象的名称时,它针对大规模存储和检索数据块进行了优化。

如果您想快速列出文件,请考虑将文件的元数据存储在针对您要执行的查询类型优化的数据库中,并且link 那些记录到你需要的存储。这是 GCP 项目中相当普遍的做法。