你好 StackOverflow 的人们,
我的问题如下:
我正在尝试使用 Node 的 cluster
工具对 express.js API 进行集群化。
我的基本文件相关结构(是的,我称之为天网...):
+ src
- SkynetCore.ts
- Server.ts
- Startup.ts
Server.ts
从 const 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