10秒内, 200个并发连接的规模
npx autocannon -c 200 -d 10 http://localhost:8080
单个进程处理多个请求
import {
createServer } from 'http'
const {
pid } = process
const server = createServer((req, res) => {
let i = 1e7; while (i > 0) {
i-- }
console.log(`Handling request from ${
pid}`)
res.end(`Hello from ${
pid}\n`)
})
server.listen(8080, () => console.log(`Started at ${
pid}`))
每秒 300 个请求
多个工作线程处理多个请求
cluster.isMaster
判断当前进程是否是主进程
下面这种写法, 为用一个应用程序开启多个实例
if (cluster.isMaster) {
// fork()
} else {
// do work
}
cluster.fork()
创建的工作线程, 执行的也是同一个模块
主进程执行的是上面 if else
的代码, 而工作线程执行的也是上面 if else
代码, 只是他俩一个在 if 内
执行, 另一个在 else 内
执行
import {
createServer } from 'http'
import {
cpus } from 'os'
import cluster from 'cluster'
if (cluster.isMaster) {
const availableCpus = cpus()
console.log(`Clustering to ${
availableCpus.length} processes`)
availableCpus.forEach(() => cluster.fork())
} else {
const {
pid } = process
const server = createServer((req, res) => {
let i = 1e7; while (i > 0) {
i-- }
console.log(`Handling request from ${
pid}`)
res.end(`Hello from ${
pid}\n`)
})
server.listen(8080, () => console.log(`Started at ${
pid}`))
}
每秒 1400 个请求
出错开启新的工作线程
import {
createServer } from 'http'
import {
cpus } from 'os'
import cluster from 'cluster'
if (cluster.isMaster) {
const availableCpus = cpus()
console.log(`Clustering to ${
availableCpus.length} processes`)
availableCpus.forEach(() => cluster.fork())
// 主进程收到 exit 事件
cluster.on('exit', (worker, code) => {
// 有错误码 && 不是主进程故意叫停
if (code !== 0 && !worker.exitedAfterDisconnect) {
console.log(`Worker ${
worker.process.pid} crashed. Starting a new worker`)
// 开启新的工作进程
cluster.fork()
}