Nodejs單進(jìn)程帶來的問題
大家都知道汁尺, nodejs是單進(jìn)程單線程的民宿,但是現(xiàn)在的服務(wù)器基本都是多核的琐簇,這導(dǎo)致了服務(wù)器資源的浪費(fèi),而且一旦程序出現(xiàn)未知異常头朱, 就會(huì)使整個(gè)進(jìn)程奔潰运悲,導(dǎo)致服務(wù)不可用,那我們?cè)撊绾蝸砀纳七@樣的情況呢项钮?
注意:nodejs在底層使用了libuv庫(kù)來實(shí)現(xiàn)多線程IO操作班眯,其對(duì)用戶不可見希停。但是nodejs的主程序還是運(yùn)行在單進(jìn)程單線程上。
cluster模塊實(shí)現(xiàn)多進(jìn)程nodejs應(yīng)用
const express = require("express")
const cluster = require("cluster")
const fs = require("fs")
const os = require("os")
if (cluster.isMaster) {
console.log("master" + process.pid + "正在運(yùn)行")
const cpus = os.cpus().length
for (let i = 0; i < cpus; i++) {
cluster.fork()
}
cluster.on("exit", (worker, code, signal) => {
console.log("工作進(jìn)程" + worker.process.pid + "已退出")
})
} else {
const app = express()
const pid = process.pid
app.listen(3000, () => {
console.log(`工作進(jìn)程${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)
})
})
}
運(yùn)行程序并且記錄到server.log可以看到
node with-cluster.js > server.log
> fork@1.0.0 start /Users/xxxxx/node-fork
> node with-cluster
master23470正在運(yùn)行
工作進(jìn)程23472 is runing
工作進(jìn)程23473 is runing
工作進(jìn)程23476 is runing
工作進(jìn)程23471 is runing
工作進(jìn)程23474 is runing
工作進(jìn)程23475 is runing
工作進(jìn)程23478 is runing
工作進(jìn)程23477 is runing
由于我的電腦是8核的署隘,所以cluster會(huì)fork出來8個(gè)nodejs進(jìn)程
使用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
>
可以看出來每個(gè)進(jìn)程的nodejs接收到的請(qǐng)求很平均宠能, cluster為我們自動(dòng)做了負(fù)載均衡