如何创建一个动态调度任务?

7

我想创建一个应用程序,模拟在酒吧开tab。但是我遇到了一个问题 - 具体如下:

  1. 当有人开启一个酒吧的tab时,动态地创建一个定时任务,在24小时后执行关闭该tab的代码。

  2. 如果tab在24小时之前关闭,取消定时任务。

  1. 如果24小时后该tab仍未关闭,则执行步骤1中描述的代码,对用于开启tab的卡进行付款。

我最初考虑使用 Firebase Functions,并思考使用 setTimeout() 可调用函数,但在进行一些研究后发现,Firebase Function的调用时间不能超过9分钟。

注意:我希望这是动态的。也就是说,它需要考虑到变量数量的用户。平台上可能有100或1000个用户,每个用户都需要能够为他们生成一个唯一的定时任务(有时每个用户会有多个任务)。


2
我可以提供一些关于如何撰写好问题的小建议吗?如果你没有定义“最佳”的客观标准,那么询问“最佳方式”是高度主观的。只需将你的问题表述为“如何创建动态调度任务”。此外,“请告诉我您认为解决这个问题的最佳方案是什么”这样的陈述是多余的,可以省略。我们都明白你想要一个答案...因为你提出了一个问题。 - Wyck
1个回答

1

请查看评论以获取完整解决方案。

绕过10分钟规则(这在无服务器代码中很普遍)有多种方法,但这里有一些可以帮助您的方法。我建议将任务分成三个部分:

  1. 一个云函数,在调用时关闭选项卡。
  2. 一个调度函数来调用它(https://firebase.google.com/docs/functions/schedule-functions)
  3. 一种启动和停止调度功能的方法。

我不确定Firebase函数是如何工作的,但我之前使用过Azure函数,可以通过命令行(CLI)或所选语言的sdk来控制它们。要使用命令行取消,尝试像这样:

firebase functions:delete scheduledFunction

来自如何取消已安排的Firebase函数?

现在剩下的问题是如何找出如何启动该函数,以及是否可能传递参数以安排它。

祝你好运!


谢谢您的回复!我还有几个问题。当创建一个计划函数时,我能否动态地创建这些函数(为多个用户创建,并将必要的付款信息传递给这些计划函数)?此外,是否有一种方法可以唯一地识别计划任务,以便如果用户关闭选项卡,我可以特定地删除它? - devon66h
@Devon 是的,只将客户ID传递给调度程序是安全的。通常这是一个POST请求来启动它,你可以把这个信息放在body里面。我想到的是为每个用户创建一个函数。所以你应该有一个名为_scheduleUser1_的计划函数,CRON设置为('0 20 * * *'),第二个是_scheduleUser2_,CRON设置为('30 20 * * *)。我使用了https://crontab.guru/#0_8_*_*_*来生成CRON。 - yichiz
然而,如果你有很多用户,那么就会有很多函数。 - yichiz
明白了,那如果用户群是可变的(每天都有新用户加入)呢?如果用户群规模扩大,我理解你的解决方案,但如何应对这种情况呢?谢谢。 - devon66h
1
嗯,这取决于您需要任务有多准确/时间敏感。如果每分钟的任务时间精度可以接受,那么您可以安排一个定时函数每分钟运行一次,以检查所有选项卡(或订单),并关闭已过期的选项卡。我假设这些选项卡存储在数据库中?此选项卡的模型应包括_userId_,_startTime_和_isActive_。如果您可以为更轻松的可扩展性和更好的成本牺牲一点准确性,那么此选项比部署自己的express服务器更好。 - yichiz
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接