【问题标题】:Programatically listing and sending requests to dynamic App Engine instances以编程方式列出请求并将请求发送到动态 App Engine 实例
【发布时间】:2017-03-13 21:52:28
【问题描述】:

我想向当前为特定 App Engine 应用程序运行的每个(动态/自动缩放)实例发送特定 HTTP 请求(或以其他方式传达消息)。

我的目标是触发每个实例丢弃一些本地缓存的数据(因为我刚刚修改了底层数据并希望它们重新加载它)。

一种可能的解决方案是在 Memcache 中存储一个值,并让实例在每次处理请求时检查此值,以查看是否应该刷新缓存。但这会增加每个请求的延迟。

另一种可能的解决方案是以某种方式停止所有正在运行的实例。没有固定开销,但在实例重启时会产生一些影响。

一个更不理想的解决方案是重新部署应用程序代码以停止所有实例。由于部署需要一些时间,现在这会增加我的延迟。

【问题讨论】:

  • 我认为目前没有任何 API 可以这样做,但您可以在 memcache 启动时将每个 API 附加到一个列表中,这样您就可以跟踪它们。
  • 你好,请看下面的文档,主题是如何调用专用实例cloud.google.com/appengine/docs/standard/java/…
  • Technomage - 正如另一条评论中提到的,看起来自动缩放实例没有调用关闭挂钩,所以虽然我可以让它们在启动时注册自己,但我目前有当他们关闭时,他们无法取消注册。 Michael - 这些是动态(自动缩放)实例,因此我认为基于 URL 的路由无法处理特定实例。
  • @CAW 不是直接的答案,但谷歌 REST API 可以列出正在运行的实例并让您停止它们。为了减少预热时间,您可以引入预热请求(不确定它们是否适用于自动扩展)和/或逐渐关闭它们。

标签: google-app-engine


【解决方案1】:

对于给定的版本,您可以使用 list instances 的管理 API,但我建议您可能希望在每个 App Engine 实例上使用类似于 create a subscription 的 PubSub API。由于每个实例都有自己的订阅,因此发送到受监控队列的任何消息都将被所有实例接收。

您可以在启动时创建订阅(the /_ah/start endpoint 可能有用),然后在关闭时将其删除(使用/_ah/stop endpoint)。

【讨论】:

  • Pub/Sub 看起来很有希望。但是我遇到了一个问题,似乎从未调用过关闭挂钩(通过 LifecycleManager.getInstance().setShutdownHook 注册)。我正在使用自动缩放的实例。为了测试,我添加了一个单行关闭钩子,它只创建一个具有特定键的数据存储实体。通过控制台或部署新版本的应用程序导致实例关闭后,我可以看到从未创建过数据存储实体。
  • 我还刚刚想到,似乎无法通过 URL 处理特定的自动缩放实例,因此我无法为 Pub/Sub Push 订阅中的每个实例注册一个端点。拉订阅也是有问题的。在处理每个传入请求之前,我必须轮询发布/订阅(根本不希望为每个请求增加延迟)。或者也许通过仅轮询每个第 N 个请求来分散这一点(但这意味着陈旧的数据将继续成为用户一段时间)。确实,某种适当的“推动”是最好的,但我担心自动缩放可能是不可能的?
  • 相信您可以使用来自 the modules API 的实例 ID 将请求路由到自动缩放的实例。
  • 我认为情况并非如此。模块 API 为我的所有自动缩放实例(长度为 79 个字符)返回一个长字母数字 ID,并且由于子域名的最大长度为 64 个字符,因此甚至无法使用此 ID 来解决它们。对于手动缩放的实例,它返回一个简短的数字 ID,所以这不是问题。
  • Pub/Sub 如果每个实例创建一个唯一的订阅然后在后台进行阻塞拉取(我在 golang 中是一个 go 例程),那么 Pub/Sub 将起作用。随着新实例上线,它们会获得唯一的订阅(使用数据存储中的计数器)。订阅可以设置为在短时间后过期以及消息。如果实例关闭后到期清理时间过长,您还可以安排一个 cron 任务来删除旧订阅。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-09
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 2018-01-02
相关资源
最近更新 更多