假设有一台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扩展实例数量的最佳方法是什么?
其他建议?
答案 0 :(得分:1)
更多细节,现在更清晰!
您有2个职责
如果您的拆分执行内部调用(例如,使用localhost),则您将仅位于同一实例上,而不会并行化任何内容(仅在同一实例上对同一请求使用多线程)
因此,您需要两项服务:
要改善您的设计,并且如果批处理可以是异步的(我的意思是,拆分过程不需要知道批处理何时结束),则可以在中间添加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应用程序时按需扩展。我相信这就是所谓的主从架构,您可以在其中将应用程序前端与繁重的工作或批处理作业分开。