firebase 在没有客户端输入的情况下,每秒定期运行一次云函数

u5rb5r59  于 2022-12-27  发布在  其他
关注(0)|答案(3)|浏览(120)

我正在开发一个应用程序,需要定期(每秒)在Firestore的字段中写入新的时间戳,此写入应在文档的特定属性等于true时执行,否则应停止定期执行-我该如何执行?

s4chpxco

s4chpxco1#

我能提供的最简单的解决方案是使用云任务。当用户创建会话时,创建一个专用的任务队列,速率限制为每秒1个,并在队列中放置一堆任务(例如每小时3600个任务)。
该任务将触发一个HTTP端点(通常是云函数或云运行端点),该端点将递增计数器。
我的主要问题是关于firestore的选择,据我所知,如果你有10个用户并行,你有10个计数器,你在firestore中写10次同样的东西,不是很有效。
我有两个主张:
1.你可以使用一个计数器,并有几个用户对象使用相同的倒计时?
1.您是否考虑过使用Cloud Memorystore内存数据库来执行每个用户的时间戳写入,并仅将结果保存在Firestore文档中?

abithluo

abithluo2#

正如您在文档中看到的herescheduled Cloud Functions的最大执行频率是每分钟执行一次
因为你需要更高的频率,你不能只使用云函数来满足你的要求,你需要使用另一种方法。

e3bfsja2

e3bfsja23#

您可以通过执行以下操作来解决此问题
1.创建每分钟运行一次的云函数
1.添加4个计时器,每15秒执行一次
注意:根据你的逻辑,这可能会花费你...不要这样做,而不了解你的使用成本将是什么,不要忘记它。我不承担任何责任的服务器着火与此有关。

export const my15SecondTimer = functions.pubsub
   .schedule("* * * * *")
   .onRun(async (context) => {
   
    // Some logic (1)
    setTimeout(async () => {
     // Some logic (2)
    }, 15000);

   setTimeout(async () => {
     // Some logic (3)
    }, 3000);
 
   setTimeout(async () => {
     // Some logic (4)
    }, 4500);
   
   });

相关问题