因此,基本上,我正在构建一个express
服务器,最近我研究了NodeJS应用程序缩放的主题。我看到的第一件事是内置在cluster
模块中,以利用机器处理器的所有线程。下面是我所做的实现的代码:
import cluster from "cluster";
import { cpus } from "os";
import dotenv from "dotenv";
dotenv.config();
import express, { Express } from "express";
import log from "./logger";
import database from "./database";
import router from "./router";
const app: Express = express();
// Middleware
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
const port = <number>(<unknown>process.env.PORT);
const host = <string>process.env.HOST;
const numCPU = cpus().length;
if (cluster.isPrimary) {
for (let i = 0; i < numCPU; i++) {
cluster.fork();
}
cluster.on("listening", (worker) => {
// Not printing anything
console.log(worker.process.pid);
});
cluster.on("exit", (worker, code, signal) => {
log.error(`Worker ${worker.process.pid} died. Starting a new worker...`);
cluster.fork();
});
} else {
app.listen(port, host, () => {
// Only prints this once.
log.info(`Server ${process.pid} listening at http://${host}:${port}`);
database();
router(app);
});
}
问题是,cluster.isPrimary
块从来不运行,这意味着集群没有分叉其他进程。然而,当我使用cluster.isMaster
时,一切都完全按照预期工作。但是由于isMaster被废弃并被isPrimary所取代,所以我正试图使用它,但它根本不起作用。
我尝试过的不起作用的解决方案:
删除machine.
我做错了什么?
发布于 2021-08-30 20:30:52
它很可能是正在运行的节点的版本。isPrimary只在16+版本中可用,而且您很可能有LTS版本,即v14。
发布于 2022-06-11 11:28:43
不久前,在节点版本v0.8.1中添加的cluster.isMaster
自16.0.0版本起就不再受欢迎了。仅当节点版本至少为16.0.0时,只需用cluster.isMaster
替换为cluster.isPrimary
(就像您所做的那样)。
如果您不知道您的版本,输入node -v
并在您的终端中点击enter。如果需要更新节点版本,则根据操作系统有不同的选项。如果您在PC上运行Windows或mac,您可以访问官方节点网站并下载并安装最新版本:https://nodejs.org/en/download/current/
如果进程是主进程,则背景cluster.isPrimary
返回true。相反,如果进程不是主进程,则可以使用cluster.isWorker
返回true。这就是对cluster.isPrimary
的否定。
许多博客文章、文章和教程仍然在应用被废弃的cluster.isMaster
。这会导致第一次处理节点聚类的节点用户之间的烦扰。
官方信息由以下节点提供:https://nodejs.org/api/cluster.html#clusterismaster
https://stackoverflow.com/questions/68978929
复制相似问题