没有足够公平的数字来说明child_process
可以处理多少,因为理论上它应该处理尽可能多的进程。
这取决于您的 SLO(服务水平目标)。如果您希望您的应用程序在 100 毫秒内响应,您应该开始负载测试。
例如
你的主进程:
const cluster = require('cluster');
console.log(`master pid=${process.pid}`);
cluster.setupMaster({
exec: __dirname+'/child-process.js'
});
cluster.fork();
cluster.fork();
cluster
.on('disconnect', (worker) => {
console.log('disconnect', worker.id);
})
.on('exit', (worker, code, signal) => {
console.log('exit', worker.id, code, signal);
// cluster.fork();
})
.on('listening', (worker, {address, port}) => {
console.log('listening', worker.id, `${address}:${port}`);
});
您的子进程:
import express from 'express';
const HOST = process.env.HOST || '127.0.0.1';
const PORT = parseInt(process.env.PORT || '4000', 10);
console.log(`worker pid=${process.pid}`);
const app = express();
app.get('sync/:limit', (req, res) => {
res.send(fibonacci(Number(req.params.limit)));
});
app.listen(PORT, HOST, () => {
console.log(`Running at http://${HOST}:${PORT}`);
});
function fibonacci(limit: number): string {
let prev = 1n,
next = 0n,
swap: bigint;
while (limit--) {
swap = prev;
prev = prev + next;
next = swap;
}
return next.toString();
}
通过autocannon运行测试
$ autocannon -c 2 http://127.0.0.1:4000/100000
它将向您显示延迟,现在您可以开始计算可以处理的最大化过程。
Node.js 应用程序可能会变得复杂。进程通常以数十个(如果不是数百个)模块结束,这些模块建立外部连接、消耗内存或读取配置。这些操作中的每一个都可能暴露应用程序中可能导致其崩溃的另一个弱点。出于这个原因,最好让主进程尽可能简单。
推荐人托马斯·亨特。使用 Node.js 的分布式系统
本书的推荐人实现
但是,有一些方法可以帮助您提高服务处理能力。
- 使用负载均衡器并扩展您的服务。
- 缓存过程或结果。
或者只是限制传入以保持您的 SLO。