Ich bin nicht sicher, welches Modell Sie sind mit dh node.js Master/Arbeiter Architektur mit Cluster nativen Modul oder child_process nativen Modul mit Nachricht usw. vorbei, übrigens trotz des Teilens Globals ist es nicht empfohlen (? wie den gemeinsamen Speicher zu handhaben, wie geschützten Speicher zu handhaben), können Sie auf diese Weise tun:
global.GlobalBotFactory = function() {
if (typeof(instance)=="undefined")
instance = new MyClass(options);
return instance;
}
und dann können Sie es auch in anderen Dateien wie
this.instance = GlobalBotFactory(); // the shared factory instance
Referenz
Aber dieser Ansatz, obwohl es funktioniert, führte könnte zu mehreren Themen wie
- gleichzeitige variable Änderung
- Shared-Memory-Korruption
- Leser/Schreiber Problem
usw. so stark ich vorschlagen einem Knoten cluster
Modul mit Master/Worker-Ansatz folgen und dann Nachricht übergeben:
/// node clustering
const cluster = require('cluster');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) { // master node
var masterConfig=require('./config/masterconfig.json');
// Fork workers.
var maxCPUs = masterConfig.cluster.worker.num;
maxCPUs=(maxCPUs>=numCPUs)?numCPUs:maxCPUs;
for (let i = 0; i < maxCPUs; i++) {
const worker=cluster.fork();
}
var MasterNode=require('./lib/master');
var master= new MasterNode(masterConfig);
master.start()
.then(done=> {
console.log(`Master ${process.pid} running on ${masterConfig.pubsub.node}`);
})
.catch(error=> {
console.error(`Master ${process.pid} error`,error);
});
}
else if (cluster.isWorker) { // worker node
var workerConfig=require('./config/workerconfig.json');
var WorkerNode=require('./lib/worker');
var worker= new WorkerNode(workerConfig);
worker.start()
.then(done=> {
console.log(`Worker ${process.pid} running on ${workerConfig.pubsub.node}`);
})
.catch(error=> {
console.error(`Worker ${process.pid} error`,error);
});
}
Für den Nachrichtenübergabe-Teil müssen Sie vorsichtig sein, da Sie mit asynchronen gegabelten Prozessen arbeiten, und in node.js gibt es keine Garantie, dass eine Nachricht zugestellt wird, so dass Sie eine ack-Logik benötigen oder eine pubsub-Methode verwenden können (Redis bietet dies für eingehende Nachrichten vom Master oder anderen Arbeitnehmern frei, überprüfen Sie bitte here), übrigens hier sind Sie
for (var i = 0; i < 2; i++) {
var worker = cluster.fork();
// Receive messages from this worker and handle them in the master process.
worker.on('message', function(msg) {
console.log('Master ' + process.pid + ' received message from worker ' + this.pid + '.', msg);
});
// Send a message from the master process to the worker.
worker.send({msgFromMaster: 'This is from master ' + process.pid + ' to worker ' + worker.pid + '.'});
}
dies den Arbeiter Gabel wird und hören. Aber denken Sie daran, dass die Lieferlogik Ihnen überlassen ist. Siehe here für weitere Informationen über subprocess.send
.