【问题标题】:GAE shutdown or restart all the active instances of a service/appGAE 关闭或重新启动服务/应用程序的所有活动实例
【发布时间】:2018-01-02 02:10:51
【问题描述】:

在我的应用程序(Google App Engine 标准 Python 2.7)中,我在全局变量中有一些标志,这些标志在实例启动时(在第一次请求时)被初始化(从 memcache/Datastore 读取值)。该变量值不会经常更改,每月仅更改一次或在紧急情况下(即当 google 应用程序引擎 Taskqueue 或 Memcache 服务无法正常运行时,如 GC 状态中报告的那样每年发生不超过两次,但严重影响了我的应用程序和我的客户:https://status.cloud.google.com/incident/appengine/15024https://status.cloud.google.com/incident/appengine/17003)。

出于效率和成本考虑,我不想将这些标志存储在 memcache 或 Datastore 中。

我正在寻找一种向所有实例发送消息的方法(请参阅我之前的帖子GAE send requests to all active instances):

https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed中所述

注意:配置为自动扩展或基本扩展的服务不支持以实例为目标。实例 ID 必须是介于 0 到正在运行的实例总数之间的整数。无论您的扩展类型或实例类如何,如果不针对该实例中的服务或版本,就不可能向特定实例发送请求。

但另一种解决方案可能是:

1) 向我的应用或服务的所有实例发送关闭消息/命令

2) 向我的应用或服务的所有实例发送重启消息/命令

我只使用自动扩展,所以我无法发送针对特定实例的请求(我可以使用 GAE 管理 API 获取活动实例的列表)。

有没有办法在 Python GAE 中以编程方式执行此操作?在 GCP 控制台中手动执行此操作在有几个实例时很容易,但对于 50 多个实例,这很痛苦......

【问题讨论】:

    标签: google-app-engine google-api google-app-engine-python


    【解决方案1】:

    可以使用 Google Cloud API 停止所有实例。然后它们将自动按比例放大到所需的水平。我的第一次尝试是这样一个过程:

    1. 配置项已更改
    2. 当前实例列表是从 API 枚举的
    3. 实例在允许启动和替换新实例的时间段内关闭,以及配置更改对时间的敏感程度。可能每 60 秒关闭一次实例。

    在使用 API 方面,您可以使用 gcloud 工具 (https://cloud.google.com/sdk/gcloud/reference/app/instances/):

    gcloud app instances list
    

    然后删除实例: gcloud app instances delete instanceid --service=s1 --version=v1

    还有一个 REST API (https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps.services.versions.instances/list):

    GET https://appengine.googleapis.com/v1/{parent=apps/*/services/*/versions/*}/instances
    DELETE https://appengine.googleapis.com/v1/{name=apps/*/services/*/versions/*/instances/*}
    

    【讨论】:

      【解决方案2】:

      受您对相关帖子的评论启发,一种可能的解决方案(实际上更多是一种解决方法)是通过重新部署相同版本的应用代码来重新启动所有实例。

      使用Google App Engine Admin API 也可以进行自动化部署,请参阅Deploying Your Apps with the Admin API

      使用 Admin API 部署您的应用版本:

      1. Upload your app's resources to Google Cloud Storage.
      2. Create a configuration file that defines your deployment.
      3. Create and send the HTTP request for deploying your app.

      需要注意的是,(重新)部署处理 100% 流量的应用版本可能会由于以下原因导致错误和流量丢失:

      • 覆盖实际正在使用的应用文件(请参阅Deploying an app 中的注释)
      • 没有给 GAE 足够的时间来以足够快的速度启动足够快的实例来处理高收入流量(更多详情 here

      使用不同的应用版本进行部署,逐步将流量迁移到新部署的应用,可以完全消除这种损失。这可能与您的特定情况无关,因为旧应用版本已经受损。

      自动流量迁移也是可能的,请参阅Migrating and Splitting Traffic with the Admin API

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多