Nodejs单进程带来的问题
大家都知道, nodejs是单进程单线程的,但是现在的服务器基本都是多核的,这导致了服务器资源的浪费,而且一旦程序出现未知异常, 就会使整个进程奔溃,导致服务不可用,那我们该如何来改善这样的情况呢?
注意:nodejs在底层使用了libuv库来实现多线程IO操作,其对用户不可见。但是nodejs的主程序还是运行在单进程单线程上。
cluster模块实现多进程nodejs应用
const express = require("express")
const cluster = require("cluster")
const fs = require("fs")
const os = require("os")
if (cluster.isMaster) {
console.log("master" + process.pid + "正在运行")
const cpus = os.cpus().length
for (let i = 0; i < cpus; i++) {
cluster.fork()
}
cluster.on("exit", (worker, code, signal) => {
console.log("工作进程" + worker.process.pid + "已退出")
})
} else {
const app = express()
const pid = process.pid
app.listen(3000, () => {
console.log(`工作进程${cluster.worker.process.pid} is runing`)
})
app.get("/test", function (req, res, next) {
console.log(`${cluster.worker.process.pid}`)
fs.readFile('./package-lock.json', (err, data) => {
res.send(data)
})
})
}
运行程序并且记录到server.log可以看到
node with-cluster.js > server.log
> fork@1.0.0 start /Users/xxxxx/node-fork
> node with-cluster
master23470正在运行
工作进程23472 is runing
工作进程23473 is runing
工作进程23476 is runing
工作进程23471 is runing
工作进程23474 is runing
工作进程23475 is runing
工作进程23478 is runing
工作进程23477 is runing
由于我的电脑是8核的,所以cluster会fork出来8个nodejs进程
使用R语言分析server.log
> df<-read.table(file="server.log")
> summary(df)
V1
worker23476:2292
worker23477:2283
worker23472:2248
worker23478:2248
worker23474:2246
worker23473:2230
(Other) :4299
>
可以看出来每个进程的nodejs接收到的请求很平均, cluster为我们自动做了负载均衡
网友评论