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:确保外部任务真正完成的首选方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Docker 微服务教程(搭建真正的网站)

ContentProvider 是啥时候真正创建的?

在自定义 SSIS 任务中执行 SQL 的首选方式是啥?

“方法 '%s' 隐藏了基本类型 '%s' 的虚拟方法”。真正隐藏的是啥?

哪种生成 GUID 的方法最适合确保 GUID 真正唯一?

Javassist。主要思想是啥,真正的用途是啥?