从自身内部调用 CloudRun 端点

Invoking CloudRun endpoint from within itself

假设有一个具有两条路由的 Flask Web 服务器,部署为 GKE 上的 CloudRun 服务。

@app.route('/cpu_intensive', methods=['POST'], endpoint='cpu_intensive')
def cpu_intensive():
    #TODO: some actions, cpu intensive

@app.route('/batch_request', methods=['POST'], endpoint='batch_request')
def batch_request():
    #TODO: invoke cpu_intensive

“batch_request”是一批许多相同的结构化请求 - 每个请求都是高度 CPU 密集的,由函数“cpu_intensive”处理。没有合理的机器可以处理大批量,因此需要跨多个副本并行处理。 部署配置为每个实例一次只能处理 1 个请求,因此当多个请求到达时,CloudRun 将复制该实例。 我想要一个具有这两个端点的服务,一个接受“batch_requests”并且只将它们分解为较小的请求,另一个端点实际处理单个“cpu_intensive”请求。 “batch_request”将批处理分解为更小的请求并调用“cpu_intensive”以便 CloudRun 扩展实例数量的最佳方法是什么?

其他建议?

我认为对于这个用例,使用 GKE 比使用云要好得多 运行。您可以创建两个 kubernetes 部署,一个用于 batch_request 应用程序,一个用于 cpu_intensive 应用程序。第二个将用作 batch_request 应用程序的工作人员,并在 batch_request 应用程序有更多请求时按需扩展。我认为这称为 master-worker 架构,在该架构中,您可以将应用前端与密集工作或批处理作业分开。

越详细越清晰!!

您有 2 项责任

  • 一个拆分 -> 多个请求可以并行处理,无需计算密集型
  • 一个要处理 -> 由于计算密集型过程,每个请求都必须在专用实例上处理。

如果您的拆分执行内部调用(例如使用 localhost),您将只在同一个实例上,并且您不会并行化任何东西(只是在同一个实例上多线程处理同一个请求)

因此,为此,您需要 2 项服务:

  • 一个拆分,可以接受多个并发请求
  • 第二次处理,此时需要将并发参数设置为1,确保同一时间只接受一个请求。

为了改进你的设计,如果批处理可以异步(我的意思是拆分过程不需要知道批处理何时结束),你可以在中间添加PubSub或Cloud Task解耦这两个部分。

如果处理需要超过 4 个 CPU 4Gb 内存,或者需要超过 1 小时,请在 GKE 上使用云 运行 而不是云 运行 托管。

最后一句话:现在,如果您不使用 PubSub,最好的方法是在您的 Split Service 的 Env Var 中设置 Batch Process URL 以了解它。