我的工作流程包括通过将任务添加到 Redis 队列来在 Google AppEngine 之外完成一些繁重的工作。工作完成后,处理 Redis 队列的外部服务器会向 GAE 发送 POST 请求。
问题是,有时Redis队列会失败,或者最后没有发出POST请求。这会导致 GAE 处于永远不会改变的“等待”状态。
为了解决这个问题,我计划实施一个“健康检查”系统,该系统会在一段时间过后自动将状态关闭为“无效”,但我想知道哪种方法是最好的方法资源和定价。
选项1:当我向Redis队列提交任务时,我还会创建一个新的GAE任务,名为“Healthcheck”,该任务将在5分钟内运行,如果当前任务未完成,则将其切换到“无效”并关闭它。
选项 2 :将任务提交到 Redis 队列时,我使用
while True
循环挂起进程并刷新当前状态,直到切换为完成。我还会设置一个 Deadline exception
观察程序,当 GAE 调用截止日期(一般为 10 分钟)时,该观察程序会将状态更新为“无效”。
优点/缺点:
还有我没有想到的第三种方法吗?
任务可以免费使用(除了非常便宜的存储空间)。我不明白为什么任务数量是一个缺点。
我认为第二种选择不是一个选择,因为它很昂贵,而且进程随时可能终止。
3d 选项是有一个 cron 作业来查询处于“运行”状态的记录,以获得超过定义的截止日期的时间。这将需要 2 个字段(状态、dt_created)的复合索引 - 与选项 #1 相比会更昂贵。
执行任务。
顺便说一句,这个问题是基于意见的,并不最适合SO,所以可以由版主关闭。