【问题标题】:Problems with Push Queues on Google App Engine Managed VM / Flexible EnvironmentGoogle App Engine 托管虚拟机/柔性环境中的推送队列问题
【发布时间】:2023-03-21 17:57:01
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    当我遇到同样的问题时,我已经完成了 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 运行时构建您自己的灵活环境。这在适合灵活环境的容器中提供了旧的 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)。这是一场不同的灾难,但更容易控制。

    祝你好运!

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

      【讨论】:

        【解决方案3】:

        我赞成 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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-24
          • 1970-01-01
          • 2018-11-28
          • 2017-09-30
          • 2018-03-29
          • 1970-01-01
          相关资源
          最近更新 更多