GAE:确保外部任务真正完成的首选方法是啥?
Posted
技术标签:
【中文标题】GAE:确保外部任务真正完成的首选方法是啥?【英文标题】:GAE : What is the preferred way of ensuring an outside task really finishes?GAE:确保外部任务真正完成的首选方法是什么? 【发布时间】:2016-12-20 10:38:54 【问题描述】:我有一个工作流程,其中包括通过将任务添加到 Redis 队列来在 Google AppEngine 之外完成一些繁重的工作。 工作完成后,处理 Redis 队列的外部服务器会向 GAE 发送 POST 请求。
问题是有时,Redis 队列失败,或者最后没有发出 POST 请求。这会导致 GAE 上的“等待”状态永远不会改变。
为了解决这个问题,我计划实施一个“健康检查”系统,该系统会在经过一段时间后自动将状态关闭为“无效”,但我想知道哪一个是最好的方法,在资源和定价方面。
选项 1 :当我向 Redis 队列提交任务时,我还会创建一个名为“Healthcheck”的新 GAE 任务,该任务将在 5 分钟内运行,如果当前任务未完成,切换为“无效”并关闭。
选项 2:将任务提交到 Redis 队列时,我使用 while True
循环挂起进程并刷新当前状态,直到它切换到完成。我还将设置一个Deadline exception
观察程序,当 GAE 调用截止日期时(通常为 10 分钟),它会将状态更新为“无效”。
优点/缺点:
选项 1 的优点是没有挂起进程,因此我认为使用的资源更少。这里的缺点是我将拥有与添加到 Redis 队列的任务一样多的“健康检查”任务(大约 30k/天) 选项 2 的优点是不会创建新的 GAE 任务,但会消耗更多资源(我认为没用)。你对此有什么建议,有没有我没想到的第三种方法?你会怎么做?
提前谢谢你:)
【问题讨论】:
【参考方案1】:任务可以免费使用(存储空间非常便宜)。我不明白为什么任务数量是一个缺点。
在我看来,第二个选项不是一个选项,因为它很昂贵并且进程随时可能终止。
3d 选项是有一个 cron 作业来查询处于“运行”状态的记录超过定义的截止日期。这将需要 2 个字段(状态,dt_created)的复合索引 - 与选项 #1 相比会更昂贵。
完成任务。
顺便说一句,这个问题是基于意见的,不适合 SO,因此可以由版主关闭。
【讨论】:
感谢您的回复,我就是这么想的。以上是关于GAE:确保外部任务真正完成的首选方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章