我们的产品目前有一个需求是:用户上传某个文件,在服务器自动转格式,然后再让用户下载。
为了实现这个过程,我们需要在服务器端通过NodeJS调用CMD来执行一些操作。这个CMD是封装好的,我们目前使用Node-cmd包来调用它。告诉它要转的文件在哪儿,转完存到哪儿,然后就开始运行cmd,运行结束后,我们拿到成功或是失败的结果。
我们后端的设计思路是:用一个数据库文件来记录所有task的状态,比如刚传上来的文件处在Pending状态,正在转码中的叫Processing,转码结束的是Success或是Fail,然后基于这个数据库,我们就可以让Node很好的安排工作。比如让Node在某种情况下循环读取这个数据库的内容,如果发现Pending中的,就去处理它。如果发现Processing的,就告知前端用户还要等几个。
程序设计这里,我们都还比较自信。
但是考虑到大并发的情况,比如N多人同时提交转码要求。我们到底该怎么最大化地使用一台云主机(目前选用阿里云ECS)的资源?我们倾向于选择单一高性能主机,而不是买一堆小主机,使用负载均衡。一来是价格更合适,二来是管理起来单一主机也更方便。
比如我们选择了一台4核4G的主机,请问该怎么让NodeJS我们这种需求下,充分使用主机资源,降低单一用户的等待时间?
希望大牛能帮忙一下,多谢!
PS:我们团队都是用JS做开发的,因此必须使用Node做服务器后台。
PHP中文网2017-04-17 16:20:03
node-CMD가 실제로 동기화된 경우에는 변경하거나 교체하는 것이 좋습니다. 기본 서버 프로세스는 작업자 프로세스에 대해 차단되어서는 안 됩니다. node는 비동기 하위 프로세스 API(child_process.exec
)를 제공합니다.
트랜스코딩의 병목 현상은 CPU 때문인 것 같습니다. 로드를 사용하여 확인할 수 있습니다. 예를 들어, 새로운 트랜스코딩 작업은 마지막 순간의 평균 로드가 특정 값보다 낮은 경우에만 시작됩니다.
귀하의 리소스와 작업에 따라 여러 가지 옵션을 시도해 볼 수 있습니다.
黄舟2017-04-17 16:20:03
귀하의 설명에 따르면, 현재 디자인에서는 기본적으로 "아직 CPU/메모리 리소스를 다 사용할 수 없습니다"라는 상황이 발생하지 않습니다.
node-cmd로 래핑된 코드 부분이 CPU를 많이 소모하는지 모르겠습니다. 동기 코드인 경우 노드의 메인 프로세스에서 실행할 수 없습니다. 비동기식이라면 기본적인 문제는 크지 않습니다.