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

问题描述 投票:0回答:1

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

问题是,有时Redis队列会失败,或者最后没有发出POST请求。这会导致 GAE 处于永远不会改变的“等待”状态。

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

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

选项 2 :将任务提交到 Redis 队列时,我使用

while True
循环挂起进程并刷新当前状态,直到切换为完成。我还会设置一个
Deadline exception
观察程序,当 GAE 调用截止日期(一般为 10 分钟)时,该观察程序会将状态更新为“无效”。

优点/缺点:

  • 我认为,选项 1 的优点是没有挂起进程,因此使用的资源更少。这里的缺点是,我将拥有与添加到 Redis 队列中的任务一样多的“健康检查”任务(大约 30k/天)
  • 选项2的优点是不创建新的GAE任务,但会消耗更多资源(我认为没用)。

还有我没有想到的第三种方法吗?

google-app-engine task
1个回答
1
投票

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

我认为第二种选择不是一个选择,因为它很昂贵,而且进程随时可能终止。

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

执行任务。

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

© www.soinside.com 2019 - 2024. All rights reserved.