我有一个很重的批处理过程(一个称为" run_simulation.py
"的python脚本(,我几乎无法控制,单个用户可以通过Web API启动它,但它读取并从磁盘上写入,以免处理并行请求。
现在,我想每个请求实现一个Docker容器,以便可以并行处理所有请求,这将是什么方法?这对Docker是否可行?负责安装容器并将HTTP请求传递给它的模块是什么?
通常您不这样做。有两个充分的理由:如果您根据请求无条件启动一个容器,那么将系统用这些背景作业淹没到没有任何进展的程度变得非常容易;而且,将允许您启动更多Docker容器的设置也将为您提供对主机的无限根级访问权限,而您在接受网络请求的过程中不需要。
更好的方法是设置工作队列系统。RabbitMQ是流行和开源的,但绝不是唯一的选择。当您收到需要背景工作的请求时,您会在队列中添加作业并立即返回。同时,您有一些工作流程,可以接受队列中的工作并进行工作。
这给您带来了一些好处。您可以并行控制多少工作(通过控制工人容器的数量(。如果您需要通过设置第二个服务器(甚至更多(来完成更多工作,则它们都可以连接回同一队列服务器,而无需复杂的多主机容器设置。如果您的工人崩溃(或获得OOM杀死(,他们的工作将退还给队列,可以被其他工人接收并重新撤回。如果您决定Docker对您不起作用,或者您需要其他编排器(Nomad,Kubernetes(,则可以在不进行任何代码更改的情况下运行此完全相同的设置,只需更改部署配置。
使用AWS lambda服务,它将每个请求运行到一个单独的容器中,所有重型伸展都会为您完成。