【问题标题】:Is it possible to obtain details of previous cron in appengine?是否可以在 appengine 中获取先前 cron 的详细信息?
【发布时间】:2015-07-16 04:54:26
【问题描述】:

我在 appengine 中有一个 cron 作业,它每 5 分钟运行一次,以检查数据存储区是否根据条目的创建时间在特定表中创建了任何新条目。由于我不想报告该条目两次,我有以下内容:

我在数据库中查询在 (CurrentTime, currentTime - 5min) 中创建的条目。这应该有效,并且在大多数情况下都有效。

问题是 cron 可能不会报告少数条目。发生这种情况是因为上一个 cron 的 (currentTime - 5) 和下一个 cron 的 currentTime 不一样,并且有轻微的毫秒变化。所以如果在这个槽中创建了一个条目,它就不会被报告。

我试图绕过这个问题。一个解决方法是我在我的查询中寻找 6 分钟,这将确保没有遗漏任何条目,但我可能需要处理重复项,这对我来说是另一项任务。 我还可以将之前 cron 执行的时间存储在 db 或某处,基于此我可以查询,但差异可能会在某些时候加起来导致延迟。

请就我如何实现这一点提出任何建议。

【问题讨论】:

  • @SaketMittal 感谢您抽出宝贵时间。我不确定代码是否有助于解决问题。我认为问题中已经提供了所有必需的信息。

标签: java google-app-engine cron


【解决方案1】:

写入条目后,通过 id 获取最后写入的条目并将其时间戳保存到数据库(并将其缓存在内存缓存中)。在您的下一个 cron 查询中使用此时间戳。

为了避免按键获取(如果您使用异步写入会更慢),您可以编写自己的时间戳并使用您已知的时间戳,而无需在写入后获取实体。缺点是现在占用更多存储空间,需要更多索引。

要完全避免修改数据库,只需按照您所说的查询最后 6 分钟。如果您设置自己的密钥名称,那么您可以只存储最后处理的密钥并跳过直到那里。但是当由于某种原因最后一个 cron 无法运行时,您将需要处理更棘手的情况,因此您不会通过回顾过去 6 分钟找到最后写入的实体。

【讨论】:

    【解决方案2】:

    我有两个建议:

    1. 为每个条目添加一个布尔标志,以标记是否已报告。因此,如果相应的条目已被报告,则必须设置它。

    2. 为了避免额外的写访问缓冲您已经报告的条目的键,以便 cron 作业可以访问它们,查询 cron 作业中的最后 6 分钟并检查每个条目的键是否在缓冲区中。

    也许第三种选择可能是在写入数据存储时执行报告工作?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      • 2021-08-01
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多