从自身内部调用CloudRun端点

时间:2020-10-26 10:37:59

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

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

  • 向本地主机发出http请求-由于负载均衡器不了解这些调用而无法正常工作。
  • 将部署URL保留在conf文件中并进行网络调用吗?

其他建议?

2 个答案:

答案 0 :(得分:1)

更多细节,现在更清晰!

您有2个职责

  • 一个可以拆分->许多请求可以并行处理,无需大量计算
  • 一个要处理的->由于计算量大,每个请求都必须在专用实例上处理。

如果您的拆分执行内部调用(例如,使用localhost),则您将仅位于同一实例上,而不会并行化任何内容(仅在同一实例上对同一请求使用多线程)

因此,您需要两项服务:

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

要改善您的设计,并且如果批处理可以是异步的(我的意思是,拆分过程不需要知道批处理何时结束),则可以在中间添加PubSub或Cloud Task来分离2个部分。

如果处理需要4个以上CPU,4 Gb内存或需要1个小时以上,请在GKE上使用Cloud Run,而不要由Cloud Run管理。

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

答案 1 :(得分:0)

我相信,对于这种用例,使用GKE而不是Cloud Run会更好。您可以创建两个kubernetes部署,一个用于batch_request应用,另一个用于cpu_tensity应用。第二个将用作batch_request应用程序的工作程序,并在有更多请求到batch_request应用程序时按需扩展。我相信这就是所谓的主从架构,您可以在其中将应用程序前端与繁重的工作或批处理作业分开。