GAE:确保外部任务真正完成的首选方式是什么?

时间:2016-12-20 10:38:55

标签: google-app-engine task

我有一个工作流程,包括通过向Redis队列添加任务,在Google AppEngine之外做一些繁重的工作。 处理完Redis队列的外部服务器会在完成工作后将POST请求发送回GAE。

问题是,有时Redis队列失败,或者最后没有发出POST请求。这导致等待"在GAE上声明永远不会改变。

为了解决这个问题,我计划实施"健康检查"系统将自动关闭状态为"无效"经过一段时间后,我想知道哪一个是最好的方法,从资源和定价。

选项1 :当我向Redis队列提交任务时,我还会创建一个名为" Healthcheck"的新GAE任务,该任务将在5分钟内运行,如果当前任务没有完成,请将其切换为"无效"并关闭它。

选项2 :将任务提交到Redis队列时,我使用while True循环挂起进程并刷新当前状态,直到它切换为完成。我还会设置一个Deadline exception观察者,将状态更新为"无效"当GAE调用截止日期时(一般情况下,10分钟)。

PROs / CONs:

  • 选项1的优点是没有挂起过程,因此我自己认为使用的资源较少。这里的缺点是我将拥有尽可能多的健康检查"任务作为添加到Redis队列的任务(大约30k /天)
  • 选项2的优点是不会创建新的GAE任务,但会占用更多资源(在我看来无用)。

你有什么建议,有没有第三种方法可以做到这一点我没有想过?你会做什么?

提前谢谢你:)

1 个答案:

答案 0 :(得分:1)

任务可以免费使用(除了非常便宜的存储空间)。我不明白为什么一些任务是一个缺点。

在我看来,第二个选项不是一个选项,因为它很昂贵并且过程可能随时死亡。

3d选项是有一个cron作业来查询处于“运行”状态的记录超过定义的截止日期。这将需要2个字段上的复合索引(status,dt_created) - 与选项#1相比将更加昂贵。

执行任务。

顺便说一下,这个问题是基于意见的,并不是最适合SO的,所以可以由主持人关闭。