【问题标题】:Adding dynamic cron jobs to GAE将动态 cron 作业添加到 GAE
【发布时间】:2012-08-20 10:54:43
【问题描述】:

在 GAE 中,我们可以通过编辑 cron.xml 文件手动添加 cron 作业

<?xml version="1.0" encoding="UTF-8"?>
<cronentries>
  <cron>
    <url>/cron/addCount/1</url>
    <description>Add count + 1 every 1 minutes</description>
    <schedule>every 1 minutes</schedule>
  </cron>
</cronentries>

有什么方法可以让我制作用户界面并即时创建/更新/删除尽可能多的 cron 作业。这意味着在我部署到 GAE 后,我应该能够更新 cron.xml 吗?或者是否有解决办法让我可以即时创建 cron 作业?

【问题讨论】:

    标签: java google-app-engine crontab job-scheduling


    【解决方案1】:

    不,这是不可能的。

    您应该将此计划数据保存到数据存储中,然后每分钟运行一次 cron 并检查是否有您需要做的事情。基本上你会做你自己的简单调度程序。

    【讨论】:

    • 谢谢,我可以在从数据存储加载触发器的情况下使用石英调度程序吗? GAE 支持石英吗?
    • 旧帖子但插话,我基本上是这样做的,它确实有效。我将动态 cron 信息动态存储在数据库中,即运行时间和 URL,并将该数据库表连接到 cron.xml/GAE 每分钟加载的页面。然后,当自定义作业的分钟数(存储在数据库中)与 GAE cron 的当前分钟数(存储在 cron.xml 中)匹配时,我将其关闭。我很好奇这是否对服务器过于繁重,是否还有更好的方法在 2018 年在 GAE 中完成动态 cron 作业?
    • @Peter Knego,我有点不同意“不,这是不可能的” - 请参阅我自己的答案,该答案建议现在可以执行此操作的服务。如果您删除此评论,我会投票支持此答案,因为自定义书面调度程序是一个很好的建议。您的方法提供了完全的灵活性并降低了成本(Google Cloud Scheduler 每项作业的成本为 0.10 美元)
    【解决方案2】:

    您可以使用推送队列来创建和运行任务。

    【讨论】:

    • 队列队列 = QueueFactory.getDefaultQueue(); queue.add(TaskOptions.Builder.withUrl("/path/to/my/worker").withEtaMillis(timeInMillis)); developers.google.com/appengine/docs/java/taskqueue/…
    • 推送队列实际上更适用于消息队列系统,并且更类似于发布/订阅。对于 cron 作业,您确实希望创建一些充当计划任务的东西。我添加了我自己的答案来建议一些选项以及何时应该使用它们。
    【解决方案3】:

    2019 年更新


    Google Cloud Scheduler 已为此特定目的而创建。它本质上是在后台运行托管的 cron 作业(包括对失败的作业进行自动重试)。

    Cloud Scheduler REST API

    RPC reference

    (我还建议考虑@Peter Knego 的建议,基于 DataStore 条目创建自己的调度程序,因为如果您需要创建大量计划任务,这可能比使用 Google Cloud Scheduler 更灵活且成本更低或围绕任务调度的复杂规则)


    另一个可能的选项(取决于您的用例)是Google Cloud Tasks。这是 Google 最近推出的 Push Queues 的更新替代品,并且有一个用于以编程方式创建新任务的 API。 Cloud Tasks 本质上集中了 Google Cloud 中的推送队列管理(尽管您可以继续将推送队列与旧 API 一起用于现有应用程序)。

    我通常不建议将其作为实现 OP 所建议的动态任务类型的一种方式,因为推送队列实际上是用于消息处理的,尤其是处理大量消息时(请参阅我关于“计划任务”的注释与推送队列')。

    如果推送队列适合您的用例的选项,快速入门指南会提供 Google Cloud Tasks API 使用示例。 Java、Python、C# 和其他语言的示例可在以下链接中找到):

    https://cloud.google.com/tasks/docs/quickstart-appengine


    计划任务与推送队列

    • Google Cloud Scheduler = 计划任务
    • Google Cloud Tasks = 推送队列(消息队列)

    您可能会问如何在使用计划任务(例如 Google Cloud Scheduler)和推送队列(例如使用 Google Cloud Tasks)之间做出决定。

    计划任务 通常用于运行时间更长或更密集的处理任务,或者用于预测和控制任务何时运行很重要的任何任务。例如,大型数据集的聚合或处理。或批量处理数据。您可以将cron jobs 视为计划任务的计划定义/配置。

    推送队列本质上是一种持久消息队列形式,通常更适合处理大流量的系统,例如一个繁忙的电子商务网站,来自用户的请求或“消息”需要与处理它们的系统(例如 Web 后端或数据库服务器)分离。这种架构用于大容量系统中,对消息进行排队以进行处理,并优先考虑处理请求的可靠性,而不是针对服务后端的即时处理。推送队列与 pub/sub 架构和技术关系更密切,例如 Google Cloud Pub/Sub

    【讨论】:

      猜你喜欢
      • 2012-10-24
      • 2011-02-26
      • 2022-01-01
      • 2012-02-08
      • 1970-01-01
      • 2012-03-04
      • 2017-05-24
      • 2011-08-23
      • 1970-01-01
      相关资源
      最近更新 更多