【问题标题】:Invoking CloudRun endpoint from within itself从自身内部调用 CloudRun 端点
【发布时间】:2020-10-26 10:37:59
【问题描述】:

假设有一个 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”处理。没有合理的机器可以处理大批量,因此需要跨多个副本并行处理。 部署配置为每个实例一次只能处理一个请求,因此当多个请求到达时,CloudRun 将复制该实例。 我希望有一个具有这两个端点的服务,一个接受“batch_requests”并且只将它们分解为较小的请求,另一个端点实际处理一个“cpu_intensive”请求。 “batch_request”将批处理分解为更小的请求并调用“cpu_intensive”以便 CloudRun 扩展实例数量的最佳方法是什么?

  • 向 localhost 发出 http 请求 - 不起作用,因为负载平衡器不知道这些调用。
  • 将部署 URL 保存在 conf 文件中并对其进行网络调用?

其他建议?

【问题讨论】:

    标签: kubernetes load-balancing google-cloud-run


    【解决方案1】:

    有了更多细节,现在更清楚了!

    你有两个职责

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

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

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

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

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

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

    最后一句话:现在,如果您不使用 PubSub,最好的方法是在拆分服务的 Env Var 中设置批处理 URL 以了解它。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2016-06-10
        • 2015-05-18
        • 1970-01-01
        • 2018-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多