Firebase 云功能(排行榜和 +10.000 用户超时)

Firebase Cloud Functions (Leaderboard & +10.000 Users Timeout)

我的应用程序有一个排行榜,每天使用 firebase 功能更新。现在我有超过 20.000 个用户,功能总是超时(已经 550 秒)。

exports.scheduledFunction = functions.pubsub.schedule('every day 00:00').timeZone('Europe/Vienna').onRun( async (contextm) => {
  functions.logger.log('Positioning stated... (v.1.0.5)');
  batch = db.batch();
  const allUsers = await db.collection('users').orderBy('coins', 'desc').get();

  let i = 0;

  for (const doc of allUsers.docs) {
    batch.update(doc.ref, "rank", i);
    i += 1;

    if(i % 499 == 0) {
      await batch.commit();
      batch = db.batch();
    }
  }

  const writeResult = await batch.commit();
  functions.logger.log('Updating Leaderboard');
  return null;
});

性能方面如何优化?

如果您将 runtimeOptions 最大化到 540 秒和 8 GB 内存,您唯一的解决方案(我可以推荐)是 运行 使用 Firebase admin SDK 在受信任的后端上编写代码。这就是我们每天重新计算仓库库存的方式。大约需要 30 分钟,因此无法在 Firebase 云函数上运行。

您无法改善性能方面的情况。代码的执行速度取决于 Firestore 的性能。 Firestore 操作将始终花费它们所花费的时间 - 它们无法加速。

您在 GCP 中唯一的选择是:

  1. 将问题分解成更小的问题,并在其自身的函数调用中解决每个更小的问题。
  2. 使用 Cloud Functions 以外的其他后端产品(因为它不适用于长时间 运行ning 操作)。

对于 #1,您可以启动其他 pubsub 函数以从主函数异步处理用户批次。您将必须打包数据的有效负载以供委托函数使用,这样它就不必重复第一个查询。每个委托调用都可以在其自己更可预测的时间内更新文档(因为您将限制每个批次的大小)。

对于 #2,您可以改为使用 Cloud 运行,这样每次调用最多可以节省 60 minutes 时间。或者,您可以设置一个 Compute Engine 实例,该实例 运行 24/7,并且您可以编写代码来调用计划函数中公开的端点。