Omar
Omar

Reputation: 3411

Running socketio and nodejs cluster module

Server

var cluster = require('cluster');

// Code to run if we're in the master process
if (cluster.isMaster) {

    // Count the machine's CPUs
    var cpuCount = require('os').cpus().length;

    // Create a worker for each CPU
    for (var i = 0; i < cpuCount; i += 1) {
        cluster.fork();
    }

    // Listen for terminating workers
    cluster.on('exit', function (worker) {

        // Replace the terminated workers
        console.log('Worker ' + worker.id + ' died :(');
        cluster.fork();

    });

// Code to run if we're in a worker process
}

else {
    const app = express();
    const server = require('http').createServer(app);

    const io = require('socket.io')(server);
    app.set('socketio', io);

    const port = process.env.PORT || 9090;

    server.listen(port,() => {
        console.log('Server running at http://127.0.0.1:' + port + '/');
    });
    io.on('connection', function (socket) {
      console.log("CONNECTED")
    });


}

Client

import io from 'socket.io-client'
    const socket = io('http://localhost:9090');
    socket.on('notification', (data) => {
      if(props.user && data.user._id === props.user._id) {
        this.setNotification(data.notification);
      }
    })

error message http://localhost:9090/socket.io/?EIO=3&transport=polling&t=MaDRz1u&sid=VzBUqt22usNbdqKCAAAb 400 (Bad Request)

When i remove the if else and keep the code that is in the else statement everything works. What do I need to add so the sessionID is not unknown.

The response object is {"code":1,"message":"Session ID unknown"}

Upvotes: 0

Views: 175

Answers (1)

Muljayan
Muljayan

Reputation: 3886

This happens because each child process created by clusters are not in sync and do not know of each other. To overcome this you will need an adapter to communicate between the clusters.

Refer the Socket.io documentation to overcome this issue.

Upvotes: 1

Related Questions