如何使用 Firebase 运行 cron 作业?

Posted

技术标签:

【中文标题】如何使用 Firebase 运行 cron 作业?【英文标题】:How to run cron job with Firebase? 【发布时间】:2016-06-14 17:51:59 【问题描述】:

我正在尝试使用 Firebase 运行 cron 作业。基本上我需要运行一个函数,该函数每天在太平洋标准时间上午 12:00 进行大量 API 调用并将数据推送到 Firebase。有没有办法让我在服务器端使用 Firebase 执行此操作?

我看到有这个模块here,,但我根本不明白它是如何工作的。如果有人有任何想法或知道上述模块如何工作,那就太好了。

编辑:想法。如果我要创建一个显示功能完成时间的数据条目会怎样。基本上检查以查看上次调用并完成该函数的时间。如果超过上午 12 点,则调用该函数并更新该字段,因此直到第二天才调用它。这是个好主意吗?我不需要该功能恰好在凌晨 12 点发生,我只需要在第一个用户登录时完成。

【问题讨论】:

Firebase 仅存储数据 - 要运行 cron 作业,您需要访问自己的服务器。 @nathanhleung 我刚刚编辑了问题...您认为这是一个好的解决方案吗? 您仍然需要有一些东西来检查数据输入 - 很可能是您自己的服务器 @nathanhleung 我不能在用户登录期间检查前端的条目吗? 嗯,实际上可以,我猜你只需要确保它在用户登录之前运行 【参考方案1】:

Firebase 上没有 cron 作业或计划选项,您必须为此使用其他平台。这是一个,例如:https://zapier.com/zapbook/firebase/schedule/

更多信息:Best way to globally set up alerts for when a Firebase location is changed

您也可以使用一些在线 cron 作业,只需使用 Google 搜索“在线 cron 作业”即可。基本上,他们只是在指定的时间调用一个 URL。

更新:现在有 cron 作业,请参阅 https://***.com/a/56063698/757508

【讨论】:

【参考方案2】:

上个月 Firebase 发布了 Cloud Functions。

在那里,您可以根据不同的钩子触发类似 lambda 的函数:Pub/Sub 事件、HTTP 事件…… 他们计划发布一个 cron 挂钩,您可以在其中使用 cron 规则触发特定功能。尚未发布,但同时你可以使用Google App Engine

【讨论】:

firebase.googleblog.com/2017/03/… 遗憾的是,它仅在 Blaze 定价计划中可用...在我仍在学习期间,不太确定是否要切换到无上限计费。 @ego 因此你可以在谷歌云上创建预算。如果您将预算设置为 0 美元,您肯定不需要支付任何费用。【参考方案3】:

要回答有关firebase-cron 工作原理的问题:

这个模块需要在某个服务器上运行,所以它始终处于开启状态。 当作业运行时,这意味着它将获取该作业的指定数据并将其放入指定的firebase-queue 引用中。作为用户,您将firebase-queue 设置为在数据添加到队列时运行。

您可以通过指定名称、cron 模式和使用.addJob 方法将数据添加到队列中来添加“cron”作业:

cron.addJob('foo', '0 0 0 * * *', foo: 'bar', function(err) 
  if (err) return console.error(err);
  console.log('added foo');
);

使用.run 方法启动firebase-cron。这将检查作业列表并执行任何需要执行的任务。该方法还带有一个回调函数,每次检查作业时都会调用该函数(我将其用于额外的日志记录)

我想向firebase-cron 添加一些内容,它是文档,但还没有得到。我已经在生产环境中使用它一段时间了,firebase-cron 本身没有任何问题......只是我的队列逻辑中的用户错误;)

另外,我一直在使用新的 Firebase Cloud Functions,它们非常棒。我可能会添加一个功能来触发云功能,而不是使用firebase-queue。一旦他们的 cron 服务运行,这可能就没有必要了。

【讨论】:

【参考方案4】:

解决方案 1

早在 2017 年 3 月,Abe Haskins 就发布了an article,介绍了如何利用 Google 的 App Engine Cron 为 Firebase 安排 cron 作业。如果你想遵循这种方法,你需要:

混帐 Python 2.7 Python 点 谷歌云 SDK

解决方案 2

Jeff Delaney 提供了一个很酷的教程,介绍如何为 Firebase 制作动态 cron 作业。你可以看看here。

此解决方案的目标是提供动态的任务调度,可以根据用户交互在客户端和服务器端进行管理。让我们考虑一些用例:

计划的或可暂停的提醒通知 发送生日快乐推送通知 注册后 24 小时发送欢迎电子邮件 如果任务因错误而失败,请重试任务

解决方案 3

最后,您还可以使用 免费 第三方 cron 作业服务,例如 cron-job.org。它看起来很简单,它给你:

每小时执行高达 60 次 状态通知 执行历史记录

希望其中一些会有所帮助。

【讨论】:

【参考方案5】:

如果您不想使用免费的在线 HTTP 触发器/请求生成器(例如 https://atrigger.com/),一种方法是在用户(客户端)与您的应用交互时触发云功能。存储的 number 类型字段可以保存 UNIX 时间戳。如果该时间戳大于 24 小时,请继续触发您的服务器端云功能(并刷新时间戳),否则停止/中断/退出。可以是一周或一个月或您想要的任何时间间隔。

如果没有用户与您的应用互动怎么办?在这种情况下,为什么要更新您的应用程序的数据?关于第一个用户的陈旧数据,这是调整时间间隔的问题。此外,您可以提醒用户正在获取新数据并等待/等待。

【讨论】:

【参考方案6】:

在 I/O 2019 上宣布了一项新功能,可以使用 firebase 函数执行 cronjobs。

看看

schedule-functions

片段 1

export scheduledFunction = functions.pubsub.schedule(‘every 5 minutes’).onRun((context) => 
  console.log(‘This will be run every 5 minutes!’);
);

片段 2

exports.scheduleJobs = functions.pubsub.
schedule(“every day 03:00”).onRun(async() => 
 // do something
console.log(“All done! See you tomorrow morning!”);
);

【讨论】:

终于不用单独部署到gcloud了!

以上是关于如何使用 Firebase 运行 cron 作业?的主要内容,如果未能解决你的问题,请参考以下文章

如何确保 cron 作业能够运行?

如何防止 cron 作业执行(如果它已经在运行)

如何在 docker 容器中运行 cron 作业

如何使用CRON作业在Joomla DB上运行此查询?

使用 CRON 作业运行 curl 命令

如何在 cPanel 上运行 CRON 作业?