Kubernetes 从自身内部调用CloudRun端点

Kubernetes 从自身内部调用CloudRun端点,kubernetes,load-balancing,google-cloud-run,Kubernetes,Load Balancing,Google Cloud Run,假设有一个Flask web服务器有两条路由,通过GKE部署为CloudRun服务 @app.route('/cpu\u-incensive',methods=['POST'],endpoint='cpu\u-incensive') def cpu_密集型(): #TODO:一些操作,cpu密集型 @app.route('/batch\u request',methods=['POST'],endpoint='batch\u request') def批处理请求(): #TODO:调用cpu\u

假设有一个Flask web服务器有两条路由,通过GKE部署为CloudRun服务

@app.route('/cpu\u-incensive',methods=['POST'],endpoint='cpu\u-incensive')
def cpu_密集型():
#TODO:一些操作,cpu密集型
@app.route('/batch\u request',methods=['POST'],endpoint='batch\u request')
def批处理请求():
#TODO:调用cpu\u密集型
“批处理请求”是由许多相同的结构化请求组成的批处理-每个请求都是高度CPU密集型的,由“CPU密集型”函数处理。没有一台合理的机器可以处理大批量,因此需要在多个副本之间并行处理。 部署配置为每个实例一次只能处理1个请求,因此当多个请求到达时,CloudRun将复制该实例。 我希望有一个具有这两个端点的服务,一个接受“批处理请求”,只将它们分解为较小的请求,另一个端点实际处理单个“cpu密集型”请求。“批处理请求”的最佳方式是什么?将批处理分解为较小的请求并调用“cpu密集型”以便CloudRun可以扩展实例的数量

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

其他建议?

我认为对于这个用例,使用GKE比使用Cloud Run要好得多。您可以创建两个kubernetes部署—一个用于批处理请求应用程序,另一个用于cpu密集型应用程序。第二个将用作batch_request应用程序的工作程序,并在batch_request应用程序有更多请求时按需扩展。我相信这就是所谓的master worker架构,在该架构中,您可以将应用程序前端与密集型工作或批处理工作分开。

更详细地讲,它现在更清晰了

你有两项责任

  • 一对多的请求可以并行处理,无需大量计算
  • 一个处理->每个请求必须在一个专用实例上处理,因为计算密集型处理
如果拆分执行内部调用(例如使用localhost),那么您将只在同一个实例上,而不会并行化任何内容(只是在同一个实例上多线程执行相同的请求)

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

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

改进你的设计,如果批处理可以是异步的(我的意思是,分割过程不需要知道批处理结束时),你可以在中间添加PubSub或云任务来解耦这2个部分。 如果处理需要超过4个CPU 4Gb的内存,或者需要超过1小时,请使用GKE上的Cloud Run,而不是Cloud Run managed

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