我们是一个小团队,全栈JS,后端用的Nodejs,做的是在线epub电子书阅读器,网址:www.neat-reader.cn 因为我们有很多用户想打开 mobi 格式的电子书,或是希望提供一个 mobi 转码成 epub 的功能。所以我们想要搭建一个专门的转码服务器。
至于转码的方式,我们是用一个叫 Calibre 的开源项目提供的 CMD 命令行。 目前我们在阿里云上有一个实验服务器(1核2G内存,Windows Server),用于测试转码服务器的效果。 现在遇到了很奇怪的问题:在本地跑的好好的,但是一旦上到服务器,就会出错,导致服务器崩溃。实在找不到原因,只能求助于大家了。
用户使用我们的服务,以及我们的程序运行的流程如下: 1.用户打开转码页面,选择一个文件,以及目标转码格式,然后点提交。 2.此时前端会向服务器发送一个任务提交请求,后端会在文本数据库中(用的nedb)创建一个task,有id信息,还有新上传的文件要存在哪里之类的信息,最重要的是一个工作状态值:uploading。然后把这些数据返回给前端 3.前端收到task创建成功的返回后,开始上传文件到指定地点(上传使用的是一个叫formidable的包),上传成功后,这个task的状态值会改为waiting。同时告诉前端,文件传完了,然后前端会每一秒使用task id询问服务器:我的这个task现在怎么样了 4.后端每次收到前端的询问请求,都会做一次判断,看看这个task是不是整个task表中,第一个状态为waiting的,如果是,则调用CMD对文件进行转码(CMD使用的是node-cmd包,这个包运行完成后会输出两种状态,要么成功,要么失败,其他我们一概不知),同时把这个task的状态改为processing,期间前端询问时,我们就告诉它正在processing,过1秒你再来问!等CMD成功或是失败后,task的状态就会修改成success或是fail。此时当前端询问时,就告诉它,如果成功,告知下载地址,如果失败,告知失败原因。到此为止,一个转码请求就算结束了。 我们认为按照这样的设计,可以保证很多用户同时提交任务也不会导致崩溃。
类似的流程可以看这个网站:http://www.epubconverter.com/epub-to-mobi-converter/
我们现在遇到的问题是:本地运行好好的,同时打开3个浏览器提交转码任务都没问题。但是一旦上到服务器,随便传两下就崩溃了。 我们猜测原因可能是下列,但是又不知道怎么确定: 1.因为服务器是1核的,本地机器是多核的,所以出问题 2.因为本地的IO操作速度非常快,但是在服务器上,因为有了上传和下载流程,导致程序出问题 3.node-cmd出问题,可能每次启动cmd命令都会影响程序
希望各位大神帮帮忙,看看我们的设计有什么问题,可能的原因是什么,怎么解决。 不胜感激啊!
PS:补充一下在线上的错误信息。每次运行时,第一次转码都能成功,第二次再转,就会出现如下的报错