NodeJS集群问题

时间:2021-05-07 06:33:11

标签: javascript node.js typescript node-cluster

你好 StackOverflow 的人们,

我的问题如下: 我正在尝试使用 Node 的 cluster 工具对 express.js API 进行集群化。

我的基本文件相关结构(是的,我称之为天网...):

+ src
 - SkynetCore.ts
 - Server.ts
 - Startup.ts

Server.tsconst skynetAPI = express();
中的 SkynetCore.ts 创建一个 Express Listener 这将传递给该函数:

export function F_ServerListener(express: any, globalLogger: any): void

我得到了另一个函数,应该基于第一个函数来管理/创建集群:

export function F_ClusterServerListener(express: any, globalLogger: any): void

F_ClusterServerListener(...)F_Main 中的 Main 方法 SkynetCore.ts 调用

所以确切的问题是,F_ClusterServerListener 只应该使用 F_ServerListener 函数,而是重新启动整个应用程序。它只应该“重新启动”F_ServerListener,而是重新启动所有内容...

我怎样才能防止它?

SkynetCore.ts


    /**
     * File: src/SkynetCore.ts
     * Description: Main File
     * Author: Oliver Karger <kmaster@oliver-karger.de>
     */
    
    // Enable dotenv
    require('dotenv').config()
    
    // Express
    const express = require('express');
    const skynetApi = express();
    
    // Signale Loggers
    const signale = require("signale");
    const logger = signale.scope('Skynet')
    
    // Startup
    import { F_EnableMiddleware } from "./Startup";
    // import { F_GetYargs } from "./YargParser"; --- Not going to spend time with that atm
    import { F_ClusterServerListener } from "./Server";
    
    /**
     * @description Main Method
     * @author Oliver Karger <kmaster@oliver-karger.de>
     */
    async function F_Main(): Promise<void> {
        F_EnableMiddleware(skynetApi, logger);
        F_ClusterServerListener(skynetApi, logger);
    }
    
    // Main Function Call
    F_Main()
    .catch(e => logger.fatal(new Error(e)));

Server.ts


    /**
     * File: src/Server.ts
     * Description: Server File
     * Author: Oliver Karger <kmaster@oliver-karger.de>
     */
    
    /**
     * @description Creates Express Server / Listener
     * @author Oliver Karger <kmaster@oliver-karger.de>
     * @param express Express Instance
     * @param globalLogger Signale Logger Instance
     */
    export function F_ServerListener(express: any, globalLogger: any): void {
        const logger = globalLogger.scope('Skynet', 'Server');
        // Create Server
        const skynetServer = express.listen(process.env.PORT, process.env.HOST, () => {
            logger.success(`Skynet Instance available on: ${process.env.HOST}:${process.env.PORT}`);
        }).on('error', (err: any) => {
            logger.fatal(new Error(err));
        });
    }
    
    const cluster = require("cluster");
    const os = require("os");
    
    export function F_ClusterServerListener(express: any, globalLogger: any): void {
        const logger = globalLogger.scope('Skynet', 'Cluster Master');
        const CPUS = os.cpus();
        if (cluster.isMaster) {
            CPUS.forEach(function() {
                cluster.fork()
            });
            cluster.on("listening", function(worker: any) {
                logger.start(`Cluster ${worker.process.pid} connected`);
            });
            cluster.on("disconnect", function(worker: any) {
                logger.stop(`Cluster ${worker.process.pid} disconnected`);
            });
            cluster.on("exit", function(worker: any) {
                logger.error(`Cluster ${worker.process.pid} dead`);
                // Ensuring a new cluster will start if an old one dies
                cluster.fork();
            });
        } else {
            F_ServerListener(express, globalLogger);
        }
    }

GitHub 上提供的源代码:https://github.com/OliverKarger/skynet/tree/development

0 个答案:

没有答案