Get your own Node server
const cluster = require('cluster');
const http = require('http');

if (cluster.isPrimary) {
  // Setup sticky session logic
  cluster.schedulingPolicy = cluster.SCHED_NONE;
  
  // Start workers
  const numCPUs = require('os').cpus().length;
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
  
  // Create routes based on connection's remote IP
  cluster.on('connection', (connection, address) => {
    // Calculate which worker gets connection based on IP
    const worker = Object.values(cluster.workers)[
      Number(address.toString().split(':')[3]) % Object.keys(cluster.workers).length
    ];
    worker.send('sticky-session:connection', connection);
  });
} else {
  // Worker code
  http.createServer((req, res) => {
    res.end(`Handled by worker ${process.pid}`);
  }).listen(8000, () => {
    console.log(`Worker ${process.pid} listening`);
  });
  
  // Receive sticky connections
  process.on('message', (message, connection) => {
    if (message !== 'sticky-session:connection') return;
    
    // Emulate a connection event on the server
    server.emit('connection', connection);
    connection.resume();
  });
}

              
Worker 4484 listening
Worker 12228 listening
Worker 16256 listening
Worker 23124 listening
Worker 31144 listening
Worker 14544 listening
Worker 31316 listening
Worker 32048 listening
Worker 27336 listening
Worker 26548 listening
Worker 9088 listening
Worker 10360 listening
Worker 7092 listening
Worker 29984 listening
Worker 29060 listening
Worker 30788 listening