如何优先处理其他密集型服务器相关任务的快速请求/响应
我的节点应用程序目前有两个主要模块:
- 刮板模块
- 一个快递服务器
前者是非常服务器密集型的任务,在循环中无限地运行。 它从100多个url上截取信息,将数据压缩成一个mongodb数据库(使用mongoose)。 这个过程一遍又一遍地运行。 :P
后一部分,我的express服务器,对http / socket get请求做出响应,并将由scraper写入db的crunched数据返回给发出请求的客户端。
我想优化我的服务器的性能,以便快速请求和响应优先于服务器密集型任务。 客户应该能够尽快获得所需的数据,而不会让刮板吃掉所有的服务器资源。
我虽然把服务器密集型任务或快递服务器放到自己的线程中,但后来我偶然发现了cluster
和child processes
; 现在我完全糊涂哪种方法适合我的情况。
我所得到的好处之一是在我的申请的写作部分和阅读部分之间有明确的分离。 刮板写入的东西数据库,明确表示读取数据(无后/ put /删除/ …)调用是暴露的。 所以,我觉得我不会遇到不同线程尝试写入同一个数据库的线程问题。
有什么好的build议? 提前致谢!
像进程所需的CPU和内存资源由操作系统pipe理。 您不应该浪费时间在源代码中编写该逻辑。
我想你应该从源代码文件之外看问题。 一旦他们跑了,他们就是进程。 正如我所说的,进程是由操作系统pipe理的。
首先,我会分裂在两个单独的命令。
一个是垃圾模块(例如npm run scrapper
,运行类似node scrapper.js
)。 另一个是你的快递服务器(例如npm start
,运行类似node server.js
)。
这种方法可以让你在你的操作系统或你的群集中进行configuration。
一个快速的方法将是使用docker。
有两个docker集装箱运行您的项目与CPU使用限制。 这样做相当容易,不需要您提升新的服务器…同时它提供了将来需要将其扩展到许多服务器的隔离级别。
步骤如下:
*学习一点关于docker工人和docker工人撰写并安装在您的服务器
*为您的应用程序构buildDocker镜像(您可以将其上传到Docker Hub免费提供的免费私人镜像)
*使用这个映像为你的两个服务构build一个docker,用你需要的cpuconfiguration(你可以很容易地设置cpu和内存限制)
另一种方法是使用cpulimit,nice / niceness和ionice等工具或手动命名空间和cgroups等其他工具运行这两个命令(但是docker会为你做这件事)。
PD:另外,我会build议重新考虑你的后端进程。 也许最好每12小时运行一次,而不是所有的时间,你可以从cron而不是循环运行它。