大家好,我们公司是做电子书阅读器的,有一个“云端转码”的需求,就是把PDF转成mobi格式这样的需求。用户上传文件到阿里云的对象存储,然后服务器要从对象存储取出数据,然后执行转码操作(具体做法请看下面),转码完成后,再把数据放到对象存储中,等待用户提取。
我们希望用一个单独的服务器来实现这个功能。目前我们使用的代码是通过child_process.exec执行一个exe文件,来实现的转码。
因为本身不是做后端的,所以有点疑问: 1.每次通过childprocess.exec执行exe时,会导致线程阻塞吗?还能不能正常接收HTTP请求? 2.最多可以执行多少次childprocess.exec,是跟CPU的核心数有关系吗?还是无关啊? 3.提取和发送文件的IO操作会阻塞服务器,导致无法对HTTP请求作出反应吗?
希望各位大神从理论上帮忙分析一下。 多谢多谢
PS:我们也知道Node不适合做计算密集型工作,但是实在没办法,公司全都是JS工程师。暂时还不准备更换语言。
1、不会的 child_process 是新开了一个进程 2、开多少个 没有限制 跟机器处理性能有关 处理越快 当然能多开 3、可以使用流 一点的读写 影响很小。
最后建议 你这种任务使用 一个 任务队列(Kue) 然后一个 一个的 执行。
@ipengyo 你好,非常感谢回答,解决了很多的疑问。关于第3点,你说的“一点的读写”,是指“一点一点的进行读写”操作吧?相当于留出间隙来处理其他操作,比如API请求,对吗?
@hz0324 嗯嗯 是的
@hz0324
使用流,不是 留出间隙来处理其他操作
,而是避免一次性读取大文件占用内存,阻塞进程,消耗大量时间。
二楼基本上都答完了,别一个请求就开一个 child_process, 你不知道会开多少个,然后boom掉。
比较好的是维护一个队列
@hz0324 https://help.aliyun.com/document_detail/51733.html
可以看看函数计算,刚好适合你的场景嘛
我在想你们服务器是windows?这个有点牛逼。 这篇贴子,也是用的childprocess.exec,根据16楼的回答,这种方案效果应该还可以 帖子地址:后段在图片上加用户基础信息,方案讨论
这是典型的消息队列场景呀,生产方将任务放到队列里,消费方拿到任务处理,消息队列可以用 RabbitMQ 或阿里云也有消息队列服务。如果不用消息队列也是可以的,简单点就把任务存 DB,转码的单独服务器,每次在 DB 取任务执行,控制下并发量就可以了。
- 不会导致线程阻塞,能正常接收请求
- 进程数量取决于你的系统和机器的资源开放问题
- 如果你开的进程很多,CPU的核心数量会影响处理速度
因此,建议使用队列服务先暂存请求,然后根据处理吞吐量进行优化。