如何为每个Web服务请求创建一个Docker容器?

时间:2019-05-06 12:20:23

标签: web-services docker

我有一个非常繁重的批处理过程(称为“ run_simulation.py”的python脚本),对此我几乎没有控制权,它可以由单个用户通过网络api启动,但可以从磁盘读写因此它将无法处理并行请求。

现在,我希望每个请求实例化一个docker容器,以便可以并行处理所有请求,这样做的方式是什么?这对Docker可行吗?负责实例化容器并将http请求传递给它的模块是什么?

1 个答案:

答案 0 :(得分:1)

通常,您不这样做。这样做有两个很好的理由:如果您无条件地为每个请求启动一个容器,则使用这些后台作业将系统淹没到无法进行的点变得非常容易;而允许您启动更多Docker容器的设置也将为您提供对主机的无限根级别访问权限,这在接受网络请求的过程中是不希望的。

更好的方法是设置作业队列系统。 RabbitMQ是流行且开源的,但绝不是唯一的选择。收到需要后台工作的请求时,可以将作业添加到队列中并立即返回。同时,您有一定数量的工作进程从队列接受工作并完成工作。

这给您带来了很多好处。您可以控制并行执行的工作量(通过控制辅助容器的数量)。如果您需要通过设置第二台服务器(甚至更多)来完成更多工作,则它们都可以连接回同一队列服务器,而无需进行复杂的多主机容器设置。如果您的工作人员崩溃了(或被OOM杀死),他们的工作将被退回队列,并可以由其他工作人员领取并重试。如果您确定Docker不适合您,或者您需要其他协调器(Nomad,Kubernetes),则可以运行完全相同的设置,而无需进行任何代码更改,只需更改部署配置即可。