防止 Google App Engine Cron 作业创建多个实例(从而耗尽我所有的实例小时数)

Preventing Google App Engine Cron jobs from creating multiple instances (and thus burning through all my instance hours)

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

我尝试了不同的时间间隔来确定这是否对实例小时数有影响,但目前无法确定差异。为了说明这一点,我收到了以下三个 cron-jobs 的 App Engine 前端实例计费:263.462 小时(仅 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

我目前仍然有多个实例,请参阅: 奇怪的是,实例从 2 --> 3 变为每分钟只有一个 cron-job。

我也很难理解为什么有 3 个实例 'created',而 0 个是 'running',而账单估计是 1 个。

与 Google 的联系可能会指出大量实例(这导致大量实例小时数),并且我的参数设置在 'automatic sclaing' 上,这允许这样做。但是,将其更改为手动会限制免费实例小时数(从 28 小时到我相信 9 小时)。

我的情况

我正在 运行 cron-jobs 调用 Pub/Sub 事件。我有 Google 监听 Pub/Sub 事件的云函数,这样我就可以根据这些滴答执行数据库更新。这是在 Google Firebase 上提供的教程之后。我了解一个实例 15 分钟的计费,即使它的生命周期更短,但我不明白如果只执行这么小的任务,如何或为什么创建多个实例。我特别感兴趣,因为在相关问题 (How can I prevent my Google App Engine cron jobs from burning through all my instance hours?) 中,那个人正在经历 24 小时,但预计只有一个实例。为什么我得到3?我觉得我缺少对这个过程的一些概念性理解,以及相应调整的工具。非常欢迎任何帮助或指点!

好吧,向其他人解释它有助于思考这个问题,这是经常发生的事情——虽然烦人但很有帮助。我希望这个答案对有同样问题的其他人有用。

我偶然发现 this Google Groups discussion, which talks about how instances of 'older' versions are kept running due to the Flexible Environment, or even when scaling is set to manual. Quite recent comments indicate that this is a roll-back issue from Google's side. Apparently (I was unaware of this), you can delete or stop the older versions and thereby stop the running instances. A related Stack Overflow question and awnser can be found here: . This also discusses how to ensure automatic instance deletion from older versions (and is probably the correct way to go). Doing it manually: go to your Appengine dashboard, click versions in the left menu, and select and delete the older versions (if not needed anymore ofcourse). This named Google Groups 讨论也说明了如何。

结果:

另外,不是左上角有版本selection。我可以 select 旧的和最新的(而不是 'all'),它向我展示了闲置的 运行 旧实例。这是 'issue' 是旧版本而不是这个版本的额外指示。天天学习!

另一件需要考虑的事情是,拥有多个具有相同或重叠时间表的 cron 作业意味着您的应用程序将大致 同时接收多个请求 - [=30= 的峰值].

动态调度程序可能会根据缩放配置和您的应用程序的响应时间,决定它需要生成额外的实例来处理此类流量高峰。您可以尝试调整缩放配置以防止出现这种情况,请参阅

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

  • 对重叠的计划使用单个 cron 条目,并在其处理程序中为您想要的每个作业单独请求 运行,时间上可能会错开一点。例如使用延迟推送队列任务,见

  • 使用明确的 cron 计划时间来最小化重叠,比如在第 1、6、11 分钟等安排一个,在第 2、7、12 等分钟安排另一个。你只有有限的时间不过,可能的组合数量。