我有一个相当繁重的批处理进程(一个名为“run_simulation.py”的python脚本),我几乎无法控制它,它可以由单个用户通过web API启动,但它从磁盘读取和写入,所以它不会处理并行请求。现在,我想为每个请求示例化一个docker容器,这样所有的请求都可以并行处理,怎么做呢?这是否可以用Docker实现?哪个模块负责示例化容器并将http请求传递给它?
run_simulation.py
axr492tv1#
一般来说,你不会这样做。有两个很好的理由:如果你无条件地为每个请求启动一个容器,那么你的系统很容易被这些后台作业淹没,以至于没有一个能继续下去;并且允许您启动更多Docker容器的设置还将为您提供对主机的无限制根级别访问,这是您在接受网络请求的进程中不希望的。更好的方法是建立一个作业队列系统。RabbitMQ是流行的开源软件,但绝不是唯一的选择。当您收到一个需要后台工作的请求时,您将一个作业添加到队列中并立即返回。同时,您有一些工作进程,它们从队列中接受作业并执行工作。这给你带来了几个好处。您可以控制可以并行完成多少工作(通过控制工作容器的数量)。如果您需要通过设置第二个服务器(甚至更多)来执行更多工作,则它们都可以连接回同一个队列服务器,而不需要复杂的多主机容器设置。如果您的worker崩溃(或被OOM杀死),它们的作业将返回到队列中,并且可以由其他worker拾取和重试。如果你决定Docker不适合你,或者你需要一个不同的编排器(Nomad,Kubernetes),你可以运行这个完全相同的设置,而不做任何代码更改,只需要更改部署配置。
p3rjfoxz2#
使用AWS lambda服务,它会将每个请求运行到一个单独的容器中,所有繁重的左移都为您完成。
2条答案
按热度按时间axr492tv1#
一般来说,你不会这样做。有两个很好的理由:如果你无条件地为每个请求启动一个容器,那么你的系统很容易被这些后台作业淹没,以至于没有一个能继续下去;并且允许您启动更多Docker容器的设置还将为您提供对主机的无限制根级别访问,这是您在接受网络请求的进程中不希望的。
更好的方法是建立一个作业队列系统。RabbitMQ是流行的开源软件,但绝不是唯一的选择。当您收到一个需要后台工作的请求时,您将一个作业添加到队列中并立即返回。同时,您有一些工作进程,它们从队列中接受作业并执行工作。
这给你带来了几个好处。您可以控制可以并行完成多少工作(通过控制工作容器的数量)。如果您需要通过设置第二个服务器(甚至更多)来执行更多工作,则它们都可以连接回同一个队列服务器,而不需要复杂的多主机容器设置。如果您的worker崩溃(或被OOM杀死),它们的作业将返回到队列中,并且可以由其他worker拾取和重试。如果你决定Docker不适合你,或者你需要一个不同的编排器(Nomad,Kubernetes),你可以运行这个完全相同的设置,而不做任何代码更改,只需要更改部署配置。
p3rjfoxz2#
使用AWS lambda服务,它会将每个请求运行到一个单独的容器中,所有繁重的左移都为您完成。