防止Google App Engine Cron作业创建多个实例(从而烧毁我的所有实例时间)

时间:2018-03-20 11:11:48

标签: google-app-engine cron instance cron-task

与这个问题(How can I prevent my Google App Engine cron jobs from burning through all my instance hours?)非常相关,但不幸的是,我不仅体验了类似的东西,在Appengine的Cron-jobs中创建了多个实例,这导致了相当多的实例小时数。

我尝试了不同的时间间隔来确定这是否会对实例小时数产生影响,但无法确定当前的差异。为了说明这一点,我收到了App Engine Frontend Instances:263.462小时,用于以下三个cron-jobs(仅用了10天!):

cron:
- description: Push a weather "tick" onto pubsub every 5 minutes
  url: /publish/weather-tick
  schedule: every 5 minutes

- description: Push a crypto "tick" onto pubsub every 5 minutes
  url: /publish/crypto-tick
  schedule: every 5 minutes

- description: Push a astronomy "tick" onto pubsub every 6 hours starting at 00:00
  url: /publish/astronomy-tick
  schedule: every 6 hours synchronized

当我每分钟将其更改为一个cron-job时:

cron:
- description: Push a "tick" onto pubsub every 1 minutes
  url: /publish/minute-tick
  schedule: every 1 minutes

我目前仍然有多个实例,请参阅: Instance Hours change over time 奇怪的是,实例来自2 - > 3每分钟改为一个cron-job。

我也很难理解为什么有3个'创建'实例,而0是'正在运行',并且结算估算为1.

与谷歌的联系可能会指向大量实例(导致实例时数过多),并且我的参数设置为“自动扫描”,这允许这样做。但是,将其更改为手动限制了自由实例小时数(从28到I相信9)。

我的情况

我正在运行cron-jobs来调用Pub / Sub事件。我有Google Cloud功能,可以监听Pub / Sub事件,以便我可以根据这些刻度执行数据库更新。这是Google Firebase提供的教程的内容。我理解15分钟实例的计费,即使它的生命周期较短,但是如果只执行这么小的任务,我无法理解如何或为什么创建多个实例。在相关问题(How can I prevent my Google App Engine cron jobs from burning through all my instance hours?)中,我特别受到攻击,这个人正在经历24小时,但预计只有一个实例。我为什么得到3?我觉得我缺少对这个过程的一些概念性理解,以及相应调整的工具。任何帮助或指示都会非常受欢迎!

2 个答案:

答案 0 :(得分:1)

要考虑的另一件事是,让多个cron作业具有相同或重叠的日程安排意味着您的应用程序将同时接收多个 的活动 - 活动高峰。

动态调度程序可能会根据扩展配置和应用程序的响应时间决定是否需要生成其他实例来处理此类流量峰值。您可以尝试调整缩放配置以防止这种情况发生,请参阅max_num_instances for Google App Engine Standard Environment

另一种避免这种情况的方法是错开请求以平滑流量模式:

  • 对重叠的计划使用单个cron条目,并在其处理程序内为您要运行的每个作业单独发出请求,可能会稍微错开时间。例如,使用延迟推送队列任务,请参阅do google app engine pull queues return tasks in FIFO order?

  • 使用显式cron计划时间来最小化重叠,比如在分钟1,6,11等处安排一个,在分钟2,7,7等处安排另一个。您只有有限数量的可能组合但是。

答案 1 :(得分:0)

好的,经常 - 有点但有帮助的 - 是,向其他人解释它有助于思考这个问题。我希望这个anwser可能对其他有相同问题的人有用。

我偶然发现了this Google Groups讨论,该讨论讨论了“老年人”的实例。由于灵活环境,甚至当缩放设置为手动时,版本仍保持运行。最近的评论表明这是谷歌方面的回滚问题。显然(我没有意识到这一点),您可以删除或停止旧版本,从而停止正在运行的实例。可以在此处找到相关的Stack Overflow问题和awnser:How to automatically delete old Google App Engine version instances?。这也讨论了如何确保从旧版本中删除自动实例(并且可能是正确的方法)。手动执行:转到Appengine仪表板,单击左侧菜单中的版本,然后选择并删除旧版本(如果不再需要的话)。 This named Google Groups讨论也说明了如何。

结果: New instances overview

此外,并不是左上角有版本选择。我可以选择较旧的和最新的(而不是' all'),它向我展示了空闲运行的旧实例。这是“问题”的另一个标志。是旧版本,而不是这个版本。每天学习!