#javascript #node.js #typescript #express
Вопрос:
Итак, в основном я создаю 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, это то, что я пытаюсь использовать, но это просто не работает.
Решения, которые я пробовал, которые не работают:
- Убейте все процессы узлов на моей машине.
- Удалите все из этого основного файла, оставив только приложение barebone и конфигурацию кластера.
Что я делаю не так?
Комментарии:
1. Какую версию узла вы используете? Потому
isPrimary
что был добавлен в v16, устаревшийisMaster
на тот момент. Если вы находитесь на v14 или v12,isPrimary
не существует (следовательно, это ложь). Чтобы соответствовать всем версиям (если вам это нужно), вы моглиif (cluster.isPrimary || cluster.isMaster)
бы . Или более чисто:if (!cluster.isWorker)
.2. @StockOverflaw вы, сэр, на 100% правы. Спасибо!
Ответ №1:
Скорее всего, это версия узла, который вы используете. IsPrimary доступен только в версиях 16 , и у вас, скорее всего, есть версия LTS, которая является v14