Google App Engine - 在发布时运行任务

时间:2016-08-02 14:46:52

标签: python google-app-engine

我一直在为我的应用寻找一个似乎没有在任何地方直接讨论的解决方案。我的目标是发布一个应用程序,让它自动与我正在使用的服务器联系。这只需要一个简单的帖子。我有一切工作正常,目前我正在用cron工作解决这个问题,但这还不够 - 我希望这个工作在应用发布后自动执行,而不是在一分钟后(或者在指定的时间内)可以设置为)。

在概念中,我试图让我的应用程序在我的服务器上注册,并且我希望它能在发布时运行一次,永远不会再次运行。

这个问题有解决方法吗?我查看了任务队列,我不确定它是否是我要找的。

任何帮助将不胜感激。 谢谢。

2 个答案:

答案 0 :(得分:2)

就个人而言,这对我来说更有意义,因为这是您的部署过程的责任,而不是应用程序本身。如果您有自己的部署脚本,请在那里添加发布请求(成功部署后)。如果您使用谷歌的命令行工具,您可以将其包装在脚本中。如果您使用第三方工具进行持续集成,他们可能会使用您可以用于此目的的部署钩子。

答案 1 :(得分:0)

主要问题是如何确保它只针对特定版本运行一次。

以下是关于如何处理它的概述。

您创建一个HasRun模块,您可以使用该模块存储已部署应用程序的每个版本,这表示是否已运行一次性代码。

然后确保在部署新代码时增加版本。

在你的预热处理程序或appengine_config.py中获取部署的版本,

然后在事务中尝试按Key(版本号)获取新的HasRun实体。

如果您获得实体,则不要运行一次性代码。 如果你找不到它,那么创建它并在任务中运行一次性代码(确保进程是幂等的,可以重试任务)或者在预热/面向前的请求中运行。

现在您可能希望将所有内容包装在memcache CAS操作中以提供锁定或某种排序。为了防止其他一些实例尝试做同样的事情。

或者,如果要使用任务队列,请考虑将任务命名为版本号,您只能提交具有特定名称的任务一次。 它仍然需要是幂等的(再次可以安排重试)但是只有一个任务安排在该版本 - 至少几周。

或上述所有内容的组合/变体。