Firebase Cloud Functions(排行榜和 +10.000 用户超时)



我的应用有一个排行榜,每天更新与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管理SDK上运行该代码。这就是我们每天重新计算仓库库存的方法。它需要大约30分钟,所以它不能在Firebase云功能上运行。

就性能而言,您无法做任何事情来改善这种情况。代码的执行速度取决于Firestore的性能。Firestore的操作总是要花很长时间——它们无法加速。

在GCP中唯一的选择是:

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

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

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

最新更新