Почему модуль кластера NodeJS не работает?

#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, это то, что я пытаюсь использовать, но это просто не работает.

Решения, которые я пробовал, которые не работают:

  1. Убейте все процессы узлов на моей машине.
  2. Удалите все из этого основного файла, оставив только приложение barebone и конфигурацию кластера.

Что я делаю не так?

Комментарии:

1. Какую версию узла вы используете? Потому isPrimary что был добавлен в v16, устаревший isMaster на тот момент. Если вы находитесь на v14 или v12, isPrimary не существует (следовательно, это ложь). Чтобы соответствовать всем версиям (если вам это нужно), вы могли if (cluster.isPrimary || cluster.isMaster) бы . Или более чисто: if (!cluster.isWorker) .

2. @StockOverflaw вы, сэр, на 100% правы. Спасибо!

Ответ №1:

Скорее всего, это версия узла, который вы используете. IsPrimary доступен только в версиях 16 , и у вас, скорее всего, есть версия LTS, которая является v14