GAE关闭或重新启动服务/应用程序的所有活动实例

时间:2017-07-26 16:10:34

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

在我的应用程序(Google App Engine Standard Python 2.7)中,我在实例启动时(第一次请求时)初始化了全局变量(从memcache / Datastore读取值)中的一些标志。变量值不会经常变化,每月只会发生一次变化,或者出现紧急情况(例如,当Google应用引擎Taskqueue或Memcache服务运行不正常时,发生的情况不会超过GC状态报告但每年两次认真对待我的应用和我的客户:https://status.cloud.google.com/incident/appengine/15024 https://status.cloud.google.com/incident/appengine/17003)。

我不想将这些标志存储在内存缓存或数据存储中以提高效率和成本。

我正在寻找一种向所有实例发送消息的方法(请参阅我之前的帖子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多个实例,它可以#&# 39;痛苦......

2 个答案:

答案 0 :(得分:1)

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

使用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.   
  3. Create a configuration file that defines your deployment.
  4.   
  5. Create and send the HTTP request for deploying your app.
  6.   

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

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

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

也可以自动进行流量迁移,请参阅Migrating and Splitting Traffic with the Admin API

答案 1 :(得分:0)

可以使用Google Cloud API停止所有实例。然后,它们将自动缩放到所需级别。我的第一次尝试将是一个过程:

  1. 配置项已更改
  2. 当前的实例列表是从API
  3. 枚举的
  4. 实例在一段时间内关闭,允许新实例旋转并替换它们,以及配置更改的时间敏感性。也许每60秒一次关闭。
  5. 在使用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/*}