web-services - 如何为每个 Web 服务请求创建一个 docker 容器?
问题描述
我有一个非常繁重的批处理(一个名为“ run_simulation.py
”的python脚本),我几乎无法控制它,它可以由单个用户通过web api启动,但它从磁盘读取和写入,因此它不会处理并行请求.
现在,我想为每个请求实例化一个 docker 容器,以便可以并行处理所有请求,这样做的方法是什么?这对 Docker 是否可行?负责实例化容器并将http请求传递给它的模块是什么?
解决方案
通常你不会这样做。这样做有两个很好的理由:如果您根据请求无条件地启动一个容器,那么很容易将您的系统淹没在这些后台作业中,以至于无法进行;并且允许您启动更多 Docker 容器的设置还将为您提供对主机的无限根级访问权限,这在接受网络请求的进程中是您不希望的。
一个更好的方法是建立一个作业队列系统。 RabbitMQ很流行并且是开源的,但绝不是唯一的选择。当您收到需要后台工作的请求时,您将作业添加到队列中并立即返回。同时,您有一些工作进程从队列中接受作业并完成工作。
这给您带来了一些好处。您可以控制可以并行完成的工作量(通过控制工作容器的数量)。如果您需要通过设置第二台服务器(甚至更多)来完成更多工作,它们都可以连接回同一个队列服务器,而无需复杂的多主机容器设置。如果您的工作人员崩溃(或被 OOM 杀死),他们的工作将返回到队列中,并且可以被其他工作人员拾取并重试。如果您认为 Docker 不适合您,或者您需要不同的编排器(Nomad、Kubernetes),您可以运行完全相同的设置而无需更改任何代码,只需更改部署配置。
推荐阅读
- amazon-web-services - AWS CloudFront | 失效
- sql - 外键复合主键问题
- postgresql - PostGIS 中的 M 值
- c# - 使用 CefSharp 时屏幕闪烁
- c++ - 如何根据另一个数组中每个元素的排名对数组进行排序(按升序)?
- angular - 将来自 Spring Boot API 的数据显示到 Primeng 图表 Angular 中
- timestamp - 有没有办法在 Apache Phoenix 中使用 TIME ZONE 信息来更新 TIMESTAMP?
- c - C、传值,在Linux中
- optimization - 如何查看llvm优化前后的差异 Selectiondag
- php - 在单独的进程中运行测试时,PHPUnit 无法生成代码覆盖率