3

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

经过一番调查,我相信这些错误可能是因为我正在将任务添加到任务队列,然后部署新版本的灵活 VM 实例。我之前推送的任务队列被锁定到旧实例,无法再运行。这就是任务队列与灵活 VM 一起工作的方式吗?如果是这样,如何在灵活 VM 中使用推送任务队列?

任务队列实例不可用

4

3 回答 3

4

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

REST API(实验性)

将 beta REST API 用于任务队列(这与来自灵活环境的所有其他谷歌 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 运行时构建您自己的灵活环境。这在适合灵活环境的容器中提供了旧的 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

笔记:我花了两周的时间在极度沮丧中恳求所有全能的上帝帮助我完成这项工作,跟随容器兔子洞进入路西法的灵魂深处并跨越未探索的维度。我最终不得不屈服。我只是无法让这个工作达到令人满意的程度。

代理服务

一种 hacky 替代方案,但它完成了工作:创建一个非常薄的标准环境包装服务,将任务代理到队列中/从队列中取出。根据需要将它们传递给您自己的应用程序。¯\_(ツ)_/¯

缺点是您现在正在启动额外的实例并消耗额外的时间。

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

祝你好运!

于 2016-10-06T13:34:25.583 回答
3

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

你的问题有两个不同的答案。

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

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

替代品是 Cloud Tasks,它公开了相同的界面,但可以完全独立于 App Engine 使用。它与 AppEngine 任务队列存在于同一个世界中,因此您将能够将任务添加到现有队列(推送和拉取)。它目前在封闭 Alpha 版中可用。您可以在此处注册加入 Alpha版。

我们强烈建议不要针对 REST API 编写新代码。它不受支持,并且云任务 alpha 的功能已经大大完善。

于 2017-07-20T21:17:29.553 回答
1

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

请记住,灵活环境(托管虚拟机)仍然只是一个计算引擎实例……谷歌在从 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

于 2016-10-22T18:06:24.880 回答