我在appengine中有一个cron作业,如果根据条目的创建时间在特定表中创建任何新条目,则每5分钟运行一次以检入数据存储区。由于我不想两次报告该条目,我有以下内容:
我在db中查询已创建的条目(CurrentTime,currentTime - 5min)。这应该有效,并且在大多数情况下都有效。
问题是cron几乎不会报告少数条目。发生这种情况是因为前一个cron的(currentTime - 5)和下一个cron的currentTime不同,并且存在轻微的毫秒变化。因此,如果在此插槽中创建了一个条目,则不会报告该条目。
我试图绕过这个问题。一个解决方法我在我的查询中寻找6分钟,这将确保没有错过任何条目,但我可能需要处理重复项,这对我来说是另一项任务。 我也可以在db或某个地方存储前一个cron执行的时间,并根据我可以查询,但差异可能会在某些时候加起来导致延迟。
请对如何实现这一目标提出任何建议。
答案 0 :(得分:0)
我有两点建议:
为每个条目添加布尔标志,以标记是否已报告。因此,如果已报告相应的条目,则必须设置它。
以避免额外的写访问缓冲您已经报告的条目的密钥,以便cron作业可以访问它们,查询cron作业中的最后6分钟并检查如果每个条目的密钥都在缓冲区中,则为每个条目。
在写入数据存储区时,可能第三种选择可能是报告内容?
答案 1 :(得分:0)
要避免按键获取(因此如果使用异步写入时速度较慢),您可以编写自己的时间戳,并使用您已知的那个,而不会在写入后获取实体。缺点是现在需要更多的存储空间并需要更多的索引。
为了避免修改数据库,只需执行您所说的有关查询最后6分钟的内容。如果你设置了自己的密钥名称,那么你可以只存储最后一个密钥,然后跳到那里。但是你需要处理棘手的情况,因为某些原因导致最后一个cron无法运行,因此你不会在过去的6分钟内找到最后写的权利。