For the following questions, we have a small notes over it which may be helpful to get overview of cluster in nodejs.
Cluster :
- Cluster in nodejs is a group of work processors.
- Number of work processors in group is decided by the number of available CPU in OS.
- - If your system processor is a quad-core processor, then you can start 4 workers
- Each work processor is started by using cluster.fork()
- fork creates the exact clone of process, using the same available port to the master process.
- same port is being shared by each worker process, due to IPC( Inter Process Communication ) technique.
Benefits of using cluster:
- Load balancing
- Multi process operation
- Multi Threading (but uses same port)
- Use of same port
- Performance increasing up-to 3.2x
var cluster = require('cluster');
var express = require('express');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
for (var i = 0; i < numCPUs; i++) {
// Create a worker
cluster.fork();
}
} else {
// Workers share the TCP connection in this server
var app = express();
app.get('/', function (req, res) {
res.send('Hello World!');
});
// All workers use this same port
app.listen(8080);
}
Note:
- Each worker process is generally a new V8 instance.
- It may takes 30ms startup time for each and at least 10mb of memory per instance.
cluster.isMaster:
This is used to check whether the cluster is a master process or the child worker process.
How are requests are divided up between the worker process?
Cluster have their two types of policy for the handling of requests.
- cluster.SCHED_RR - Round Robin Policy ( by default, it is set in Linux and OSX )
- cluster.SCHED_NONE ( by default, it is set in Windows )
How to change the policy manually?
cluster.schedulingPolicy is used to set the policy type you want to set.
Or NODE_CLUSTER_SCHED_POLICY is set in your environment.
Difference between cluster.fork() and child_process.fork()
cluster.fork() - It starts from the beginning (entry) of the module.
child_process.fork() - It starts where its been defined.
child_process.fork() method is a bit lower-level and required arguments like
- location (file path) of the module as an argument,
- current working directory,
- user that owns the process,
- environment variables...