【问题标题】:One Instance-One Request at a time App Engine Flexible一次一个实例一个请求 App Engine Flexible
【发布时间】:2020-01-25 23:27:24
【问题描述】:

我正在使用

  • App Engine 灵活的自定义运行时。
  • nodejs,作为基础镜像。
  • 快递
  • 用于对请求进行排队的 Cloud Tasks
  • 木偶工作

我的要求

  • 20GB 内存
  • 长时间运行的进程

由于我的独特要求,我希望 1 个请求仅由 1 个实例处理。当它空闲或请求超时时,它才会收到一个新请求。 在实例处理 1 个请求时,我设法拒绝了其他请求,但无法找出适当的自动扩展设置。

请提出实现这一目标的最佳方法。 提前致谢!

【问题讨论】:

  • 什么是长时间运行的进程(多少分钟/小时)?为什么要灵活使用 AppEngine?需要二进制文件吗?标准中不支持的语言?
  • 我的要求是每个请求大约 20 分钟。 AppEngine 灵活,因为它可以提供 20GB RAM 机器并且是托管的。 Standard、Cloud Functions 甚至 Cloud Run 最多仅支持 2 GB RAM。

标签: node.js amazon-web-services express google-cloud-platform google-cloud-tasks


【解决方案1】:

在您的app.yaml 中尝试限制max_instancesmax_concurrent_requests

我还建议查看 rate limiting 您的 Cloud Tasks 队列,以减少不必要的发送请求尝试。此外,您可能还想增加您的 MIN_INTERVALretry attempts 以分散请求。

您的任务队列将继续按照您设置的速率处理和发送任务,因此如果您的实例拒绝请求,它将进入重试模式。您似乎专注于 App Engine 的扩展,但您的问题在于 Cloud Tasks。您可能希望安排您的任务,以便它们在您想要的时间间隔内触发。

【讨论】:

  • 如果您还没有,我还建议您查看max_idle_instancesmin_indle_instances。正确设置这些元素可能对您的应用有益,因为它可以在负载突然激增的情况下做出响应。
  • 限制max_num_instances 有什么帮助?相反,它不会再次请求相同的已加载实例吗?虽然这里没有提到max_concurrent_requestscloud.google.com/appengine/docs/flexible/nodejs/reference/… 但我试过了,得出的结论是它没有帮助
  • 我猜“max_num_instances”建议是为了避免在太多实例上进行扩展(假设每个实例只处理 1 个请求)。那里没有提到“max_cocurrent_requests”,但这里提到了 -> cloud.google.com/appengine/docs/flexible/nodejs/…,所以它也应该在 Flex 上工作。你能更具体地说明为什么它没有帮助吗?它的行为是什么?您期望会发生什么?
  • 虽然您专注于 App Engine 设置,但您似乎需要考虑安排您的任务以在设定的时间触发它们(如果您知道处理每个任务大约需要多长时间,则间隔更长)。我已经更新了我的答案以反映这一点。
  • @Mayeru max_concurrent_requests 没有帮助,因为应用引擎发送不会等待实例完成作业并将第二个请求发送到已经处理第一个请求的实例。 @AveriKitsch 假设我的任务需要 10 分钟,我可以以 11 分钟的间隔率安排任务,但是它不会并行化请求。这将是一个顺序队列。我正在寻找的是一个并行管理的解决方案:)
【解决方案2】:

您可以在您的应用上设置readiness checks

当实例正在处理请求时,将就绪检查设置为返回未就绪状态。 429(请求太多)似乎是个不错的选择。

这应该避免到该特定实例的流量。

请求完成后,从就绪端点返回一个200,表示实例已准备好接受新请求。

但是,我不确定这将如何与自动缩放选项一起使用。由于应用程序只会在平均 CPU 超过定义的阈值时扩展,如果所有实例都被占用但没有达到该阈值,负载均衡器将不知道将请求路由到哪里(没有实例准备好),它会赢不要扩大规模。

您可以尝试一下这个想法和手动缩放,或者通过GAE admin API 以编程方式更改min_instances(在自动缩放中)。

确保始终为liveness check 返回200,否则实例将被终止,因为它会被视为不健康。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 2020-07-12
    相关资源
    最近更新 更多