j4nk3y: Node.js + socket.io, Cluster / Multithreading

Beitrag lesen

problematische Seite

Guten Morgen zusammen,

Ich habe gestern das Cluster Modul von Node.js gefunden und würde dies gern in mein bestehendes Projekt implementieren. Dabei treten aber einige Probleme auf und ich hoffe jemand kann mir weiterhelfen.

Etwa folgendes läuft seit geraumer Zeit auf meinem Raspi problemlos:

var port = process.env.PORT || 1337;
var server = require('http').createServer().listen( port );
var io = require('socket.io').listen( server );

var user = require('./functions/server/js/user'); // Beispiel für ein eigens externes Modul.

io.sockets.on('connection', function( socket ){
	
	socket.on('getConnection', function( req ) {
		user.getConnection( socket, req, function ( res ) {
			socket.emit('setConnection', res);
		});
	});
  
  //.
  //.
  //.
});

Wenn ich das Beispiel folgenderweise bei mir umsetze, bekomme ich zum Beispiel, gar keine Verbindung mehr zum Server und erhalte im Browser nur ein "400 (Bad Reaquest)" beim Verbindundungsversuch zurück.

var cluster = require('cluster');

var port = process.env.PORT || 1337;
var threads = require('os').cpus().length;

var user = require('./functions/server/js/user');

if( cluster.isMaster ) {
	
	for(var i = 0; i < threads; i++) {
        cluster.fork();
    }
	
	cluster.on('online', function( thread ) {});
	
  cluster.on('exit', function( thread, code, signal) {
        cluster.fork();
  });
	
} else {
	var server = require('http').createServer().listen( port );
	var io = require('socket.io').listen( server );

	io.sockets.on('connection', function( socket ){

	  socket.on('getConnection', function( req ) {
			user.getConnection( socket, req, function ( res ) {
				socket.emit('setConnection', res);
			});
		});
  
  //.
  //.
  //.
});

Weiterhin werden alle externen Module für jeden thread neu geladen. Sprich in dem Beispiel wird var user = require('./functions/server/js/user'); bei mir 4 mal aufgerufen. Da ich vermute, dass die ganzen Daten im RAM gespeichert werden, würde ich gern die Beanspruchung so gering wie Möglich halten. Daher: Kann man das irgendwie verhindern, beziehungsweise user so Global setzen, dass jeder thread darauf zugreifen kann?

Schonmal vielen Dank für eure Hilfe.

Gruß
Jo