首页 > 解决方案 > 如何以编程方式在 Firebase 中创建 cron 作业

问题描述

我在这里有一个独特的问题。我实际上需要安排一项任务,以便在特定时间向符合条件的用户发送电子邮件。我检查并发现调度 cron 作业可以解决问题。但是,就我而言,我需要根据特定用户何时满足某些条件以编程方式安排这些任务。

这是我的场景

  1. 我在我的应用程序中运行推荐活动,推荐最多 5 人的用户可以获得折扣订阅

  2. 用户推荐5人后,只要在24小时内付款,订阅费用就会大幅降低。否则成本返回原始值

  3. 我正在使用 Firebase 云功能在特定时间向符合条件的用户发送提醒电子邮件提醒,以便在 24 小时前付款

现在的问题

  1. 我想在特定时间发送提醒电子邮件,比如他推荐 5 个人,当他的时间剩余时说 3 小时等。

  2. 如果我只是安排一个功能而不考虑用户,我可能必须定期设置 cron 作业,比如 1 分钟,以始终检查我的数据库中的用户是否符合条件,然后向他们发送电子邮件。这带来了严重的问题,无论是否有合格的用户,都会运行云功能。

  3. 另一个问题是,通过上述实现,我无法在特定/准确的时间向用户发送电子邮件,除非我将任务安排为每 1 秒一次,这当然会飞涨,因为云功能将被调用大约 86400 次(86400 秒) ) 一天

我提出的解决方案

  1. 我只需要一种动态安排 cron 任务的方法,以便我可以为特定用户安排作业。这将解决许多问题,例如在特定时间发送电子邮件,防止云功能在不需要时运行,能够为不同用户设置不同的电子邮件发送时间等

  2. 我计划使用带有用户 ID 请求参数的 http 触发器来调度任务,以便 firebase 可以使用此 ID 将任务分配给仅特定用户,即每个符合条件的用户都有自己的 http 触发器

请问有没有办法为我的情况实现这个或任何其他好的解决方案?

标签: firebasegoogle-cloud-platformgoogle-cloud-firestoregoogle-cloud-functionsscheduled-tasks

解决方案


与其尝试动态创建计划函数,不如考虑拥有一个按固定计划运行的函数,然后在该函数内部实现时序逻辑。

因此,不要说“我需要安排一个从现在开始运行 3 小时的函数并向这 5 个人发送消息”,而是将其视为可以写入数据库的任务:“在 x:yz 发送电子邮件至这 5 个人”,然后有一个定期的云函数来检查它需要执行的任务。

另请参阅延迟 Google Cloud Function如何将调度程序用于 Firebase Cloud Functions 和实时数据库/分析触发器?

或者,您可以使用Cloud Scheduler为要执行的特定操作创建任务,然后通过 PubSub 将其发布到 Cloud Functions。

作为一种更新的替代方案:使用具有 API 的单独调度程序服务来创建调度,例如 Cloud Tasks。Doug 在How to schedule a Cloud Function to run in the future with Cloud Tasks (to build a Firestore document TTL)中写了一篇很棒的文章。


推荐阅读