Google App Engine托管虚拟机/灵活环境中推送队列的问题

时间:2016-05-18 04:32:08

标签: google-app-engine task-queue google-managed-vm

我在Google App Engine的灵活环境(正式命名为其​​托管虚拟机环境)上使用推送队列时遇到问题。我收到了很多404 Instance Unavailable(见下图)。

经过一些调查后,我相信这些错误可能是因为我将任务添加到任务队列,然后部署新版本的Flexible VM实例。我之前推送的任务队列被锁定到较旧的实例,并且无法再运行。这是taskqueues如何与Flexible VM一起使用的吗?如果是这样,如何使用Flexible VM推送任务队列?

taskqueue instance unavailable

3 个答案:

答案 0 :(得分:4)

当我遇到同样的问题时,我90%完成了迁移到灵活的环境。经过广泛的研究,我得出结论有三种选择:

REST API(实验性)

将beta REST API用于任务队列(因为灵活环境中的所有其他Google API都是外部的,因此您需要适当地处理身份验证)。

REST API参考:https://cloud.google.com/appengine/docs/python/taskqueue/rest/

注意,这是外部和实验性的。查找例如这里没有任何有意义的文档的java sdk:https://developers.google.com/api-client-library/java/apis/(当前版本:https://developers.google.com/api-client-library/java/apis/taskqueue/v1beta2

Compat runtime

基于-compat运行时构建您自己的灵活环境。这将旧的appengine api放在适合灵活环境的容器中:

https://cloud.google.com/appengine/docs/flexible/custom-runtimes/build(在最后一栏中查找带“是”的图片)

例如:https://cloud.google.com/appengine/docs/flexible/java/dev-jetty9-and-apis

https://cloud.google.com/appengine/docs/flexible/java/migrating-an-existing-app

注意:我花了两个星期的闷闷不乐恳求每一个全能的上帝帮助我让这个工作,沿着容器兔洞进入路西法的灵魂深处,并探索未开发的维度。我最终不得不屈服。我只是无法让这个工作达到令人满意的程度。

代理服务

有点像hacky替代方案,但它完成了工作:创建一个非常精简的标准环境包装器服务,它将任务代理到队列中。将它们传递到您自己的应用程序,但您想要。 ¯\ _(ツ)_ /¯

下行是你现在正在增加额外的实例并燃烧额外的时间。

我最后得到了一个变体,我在标准环境中使用代理服务,但只是将我的最终任务处理程序移植到AWS Lambda(所以它完全取决于GAE)。这是一场不同的灾难,但更容易管理。

祝你好运!

答案 1 :(得分:2)

我是该产品的技术主管和经理。

您的问题有两个截然不同的答案。

首先,您似乎遇到版本路由问题 - 正如您所说,由于您启动了新版本,因此无法对VM运行任务。默认情况下,任务被分配为在其入队的版本上运行,以避免版本不匹配。您应该能够通过在queue.yaml(或queue.xml)中重新配置目标来覆盖该版本。可以找到here的文档。您可能还需要查看

从更广泛的角度来看,构建迁移路径远离标准/仅MVM支持任务队列是目前我们的首要任务。

替换是Cloud Tasks,它暴露相同的界面,但可以完全独立于App Engine使用。它与AppEngine任务队列存在于同一个Universe中,因此您可以将任务添加到现有队列(推送和拉取)。它目前以封闭式alpha提供。您可以注册加入字母here

我们强烈建议不要针对REST API编写新代码。它不受支持,云任务alpha已经基本上更完整。

答案 2 :(得分:1)

我赞同hraban的回答(毕竟他确实与魔鬼搏斗),但在这里提供了额外的答案。

请记住,灵活环境(托管虚拟机)仍然只是一个计算引擎实例...... Google在从AppEngine中提取功能以便以透明的方式访问它们方面做得很好。 TaskQueues并没有完全成功。密切关注云库 - 这是DataStore可用的机制(对于Java转到http://googlecloudplatform.github.io/google-cloud-java/0.3.0/index.html)。如果您转到该链接,您还可以选择其他语言。我的官方消息是TaskQueues仍然在路线图上(但没有ETA)。

截至目前,您无法使用REST api排队到PUSH队列。现在我决定解决这个问题的方法是使用REST API并创建一个PULL队列来放入任务。然后我在AppEngine服务(即模块)中轮询该队列并将其放入PUSH任务队列。为什么我会遇到这些麻烦?因为我需要计划执行...这是TaskQueues单独可以在AppEngine上提供的功能。所以我将我的任务打包在一个信封中,然后解压缩并重新将其推入任务队列。听起来很疯狂?它一直在为我工作。不要因为REST api是" alpha"而被吓跑了。

我会说,如果你开始新的事情,请好好看看Pub/Sub API