我在Google App Engine的灵活环境(正式名称是他们的托管VM环境)上使用推送队列时遇到了问题。我收到了大量的404 Instance Unavailable (见下图)。
经过一些调查,我认为这些错误可能是因为我正在向任务队列中添加一个任务,然后部署一个新版本的灵活VM实例。我之前推送的任务队列被锁定到较旧的实例,无法再运行。这就是任务队列与Flexible VM的工作方式吗?如果是这样,如何在灵活的虚拟机中使用推送任务队列?

发布于 2016-10-06 21:34:26
当我遇到同样的问题时,我已经完成了90%的迁移到flexible env。经过广泛的研究,我总结出有三种选择:
REST API (实验性)
对任务队列使用beta REST API (这与来自flexible env的所有其他google API一样,都是外部的,因此您需要适当地处理auth )。
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运行时
基于-compat运行时构建您自己的灵活环境。这在适用于灵活环境的容器中提供了旧的appengine api:
https://cloud.google.com/appengine/docs/flexible/custom-runtimes/build (查找最后一列中带有"YES“的图像)
例如:https://cloud.google.com/appengine/docs/flexible/java/dev-jetty9-and-apis
https://cloud.google.com/appengine/docs/flexible/java/migrating-an-existing-app
注:我花了两个星期沮丧地恳求万能的上帝帮助我完成这项工作,跟随容器兔洞进入路西法的灵魂深处,穿越未知的维度。我最终不得不放弃。我就是不能让它工作到令人满意的程度。
代理服务
这是一种老生常谈的选择,但它完成了工作:创建一个非常薄的标准环境包装器服务,它将任务代理到队列中或从队列中代理出来。随心所欲地将它们传递给你自己的应用程序。¯\_(ツ)_/`
缺点是您现在正在旋转额外的实例和消耗额外的分钟。
我最终得到了一个变体,我在标准环境中使用了一个代理服务,但只是将我最终的任务处理程序移植到了AWS Lambda (所以它完全脱离了GAE)。这是一场不同的灾难,但更容易管理。
祝好运!
发布于 2017-07-21 05:17:30
我是这个产品的技术负责人和经理。
你的问题有两个截然不同的答案。
对于第一个问题,您似乎遇到了版本路由问题--正如您所说,任务不能在VM上运行,因为您启动了一个新版本。默认情况下,会将任务分配为在其入队时所在的版本上运行,以避免版本不匹配。您应该能够通过在queue.yaml (或queue.xml)中重新配置目标来覆盖该版本。相关文档可以在here上找到。您可能还需要查看您的
从更广泛的角度来看,构建一条远离标准/MVM-only支持任务队列的迁移路径是我们当前的首要任务。
取而代之的是Cloud Tasks,它公开了相同的接口,但可以完全独立于App Engine使用。它与AppEngine任务队列存在于同一领域,因此您将能够将任务添加到现有队列(包括推送和拉取)。它目前有closed alpha版本。你可以注册加入alpha here。
我们强烈建议不要针对REST API编写新代码。它是不受支持的,并且云任务alpha已经实质上是更完整的功能。
发布于 2016-10-23 02:06:25
我肯定hraban的答案(毕竟他确实与魔鬼搏斗过),但在这里提供了一个额外的答案。
请记住,灵活环境(托管虚拟机)仍然只是一个计算引擎实例...谷歌在从AppEngine中提取特征方面做得很好,使它们能够以透明的方式访问。TaskQueues并没有成功。密切关注云库--这是DataStore变得可用的机制(对于Java语言,请转到http://googlecloudplatform.github.io/google-cloud-java/0.3.0/index.html)。如果您转到该链接,还可以选择其他语言。我在官方消息上说,TaskQueues仍然在路线图上(但没有预计)。
到目前为止,您还不能使用REST api 将队列加入到推送队列中。现在,我决定解决这个问题的方法是使用REST API并创建一个拉取队列来放入任务。然后,我轮询AppEngine服务(即模块)中的队列,并将其放入推送任务队列中。为什么我要费这么大的劲?因为我需要按计划执行...这是AppEngine上仅TaskQueues就能为您提供的功能。因此,我将任务打包在信封中,然后解包并将其重新推送到任务队列中。听起来很疯狂?它对我来说一直很可靠。不要被REST api是"alpha“的事实吓跑了。
我要说的是,如果你开始新的东西,好好看看Pub/Sub API吧。
https://stackoverflow.com/questions/37290352
复制相似问题