大概是这样的一个需求:
一个自动执行特定任务的平台,可添加使用 Python 编写的程序,平台将任务分配给其他节点执行,结束后返回执行结果。
使用的 Python 版本以及返回结果都有相关约定,但是平台中的 N 个独立不相关的程序可能分别依赖不同的第三方模块,要自动的执行这些程序,需要解决模块依赖问题。
现在遇到的问题是: 如何自动解决任务对第三方模块的依赖?
暂时的思路是用 virtualenv,执行任务的节点接收到任务后创建一个环境,安装所需依赖,结束后销毁该环境,然后等待分配新任务……不断循环。
或者把使用频率高的库列一个表,提交的任务只允许使用表中的模块?
还有就是把任务用 cx_Freeze 之类的工具打包后分发,这样会不会更好一点?
以 automated deployment 之类的关键字进行搜索,大多是使用 Fabric,跟需求不太一致。
大家有没有什么好一点的思路?请帮忙指点一下,或者推荐些类似需求的项目参考。
希望上面的描述足够清楚,如有欠妥之处请指出。
1
lijianying10 2015-07-14 23:46:53 +08:00 1
所以你需要的是把各种环境隔离开。
因此这里推荐使用Docker,可以从Busybox开始构建,Image不会太大的。 性能几乎无损耗。迁移非常方便,可分发。 希望能帮到楼主。 |
2
lijianying10 2015-07-14 23:47:50 +08:00
因为不了解业务只能推荐到这里,如果可以详细了解业务内容(特性,特别要求)可以看看能不能帮你出个方案。
|
3
evlos 2015-07-14 23:57:28 +08:00 1
推荐用 Docker +1,直接制作好特定环境的 Image,这样环境的问题就解决了。
比如这样写好 Java 7 的环境, https://github.com/Evlos/dockerfile/blob/master/openjdk7/Dockerfile 再引用这个环境, https://github.com/Evlos/dockerfile/blob/master/bukkit/Dockerfile 然后分发到指定节点创建 container 执行相应的任务。 |
4
Owenjia OP @lijianying10
感谢回复,因为没有用过 Docker,所以刚刚去搜了下相关的文章,如果理解有不对的地方,请谅解。 Docker 的镜像在分发的时候好像是一样的?这里的各个任务可能依赖不同的第三方模块,所以如果环境一样的话还是没有解决对第三方模块的依赖问题;如果为每个任务分别建立镜像,相比 virtualenv 似乎没有太大优点? |
5
hwind 2015-07-15 00:14:36 +08:00 1
可以考虑一下两种思路:
1. 在所有执行节点预先安装模块;如果要提交的程序需要的模块不在预安装之列,则允许程序打包第三方模块一起提交。 2. 采用Docker或者类似的sandbox技术,每个程序有独立的sandbox,互不影响。 方案的选择根据你的需求而定。如果你的Python程序大多类似(比如都是做某一类的业务,只是逻辑不同)那么预先安装模块,或者由程序打包模块会比较简单。如果你打算做的是非常通用大Python程序运行平台,那sandbox比较合适,因为预装能覆盖到模块比较有限,另外即使是同一个问题,还有版本差异的问题。 |
6
Owenjia OP @hwind
打算是通用型的,不过目前测试用的例子大多是爬虫一类的。 第一种思路有考虑过,模块版本不一致的问题打算当作不同模块来处理。 至于 Docker,正在了解中,在我认识里大概是类似 chroot 的一个沙盒,能否具体说一下在这种情景中使用 Docker 的好处?似乎 virtualenv 更方便一些。 |
7
hwind 2015-07-15 02:27:11 +08:00 1
@Owenjia 首先一个原则应该是“不要重复发明轮子”。已经有Docker之类流行的解决方案的情况下,自己重新做一个类似的东西意义不大。我感觉你用virtualenv的方案是Docker的一个子集。virtualenv可以解决Python模块依赖的问题。不过还有一些其他问题需要考虑, 比如系统模块依赖的问题。假设某个Python程序除了调用Python模块,还依赖于一些系统的库,virtualenv搞不定。另外,沙盒可以保证程序之间互不影响,比如有人写了个程序去kill掉所有其他进程,virtualenv也搞不定。还有比如系统资源分配,你一定不希望某一个程序占用过多的资源。
|
8
lijianying10 2015-07-15 08:04:15 +08:00 1
==========可能的利好
1. Docker 安装方便,相对于virtualenv来说,CoreOS直接就安装好了, 1.1 CoreOS 可以部署到各种云平台上,以各种方式(PXE启动,云平台启动,各种虚拟化环境启动) 1.2 Kubernets 管理你的Docker 提供集群的资源调度、部署运行、服务发现、扩容缩容等整一套功能。 1.3 如果集群管理的比较好,上CoreOS可能无需配置,上架机器几分钟就可以开始跑业务。 2. Docker 可以针对环境做出类似Git一样的版本管理。 1.1 对于ABC相同的部分可以直接建立一个Image 1.2 对于A不同的依赖,简历ImageA 1.3 以此类推。 1.4 提交到自己的DockerHub中备用 1.5 Image一般情况下几百MB就挡住了,如果你愿意裁剪,可能几十MB 3. Docker启动速度快,基本上命令输入了之后就跑起来了。 ==========特性 4. 方便的持久化方便 5. 灵活的资源调度与管理 6. 我还是不要妄下结论了,如果LZ有机会可以都实践一下,具体有啥不同只有都做过之后LZ才知道。 最后希望能帮到LZ |