A single instance of Node.js runs in a single thread. This does not allow to take advantage of multi-core systems automatically. However, by leveraging ‘cluster module’ one can take advantage of multiple CPU cores. Clustering improves your app’s performance and lets you achieve zero downtime (hot) deployments easily. Also keep in mind that number of workers that can be created is not limited by the number of CPU cores of the machine. Clustering is a must-have for any Node.js production app and there is no reason not to use it.
Run the below code
That’s how easy it is. Cluster module lets you fork multiple child processes (using child_process.fork()). Making use of the events ‘online’, ‘disconnect’, ‘listening’, ‘message’, ‘error’ and ‘exit’ emitted by worker process, the state of worker process can be easily managed; however, this is not further explained in this article.
Inter Process Communication (IPC)
The worker processes spawned can communicate with the parent via IPC (Inter Process Communication) channel which allows messages to be passed back and forth between the parent and child. Cluster module makes use of ‘process.send()’ and process.on(‘message’) to communicate between two processes.
One can dedicate specific workers to do specific tasks. Expensive tasks which are either I/O intensive or CPU intensive can have dedicated worker process/processes. The master can delegate the tasks to dedicated workers. Initialize worker with custom id.
Worker process ‘env’ is not exposed to master. One approach is to maintain a map of cluster with required info.
Master can delegate tasks to specific worker something like this
Similarly, message communicated between master and worker can be customized to delegate tasks. e.g.
Complete code snippet
Based on the above understanding of Node.js clustering and IPC, processes can communicate in following interaction styles while acting as client and server.
- One-to-one: Typically used for one to one notification or request/response.
- One-to-many: Typically used for publish/subscribe.
Clustering is a must have for any Node.js production app. It helps to scale according to the number of CPU cores available on the machine. It is also easier to manage as there is no dependency on any external module/service. Implementing inter process communication is also very easy. IPC using Node.js cluster module is in memory and hence scalability becomes an issue. Performance also takes a hit when there are too many messages. Management of process state has to be done by yourself.
PM2 with use of message broker like RabbitMQ can also be used to manage the processes and inter process communications which provides more flexibility with the only downside of adding external dependency. It also helps in horizontal scaling and provides a flexible architecture. ‘node-ipc’ is a Node.js module for local and remote Inter Process Communication with full support for Linux, Mac and Windows. It also supports all forms of socket communication from low level unix and windows sockets to UDP and secure TLS and TCP sockets.
You can read more about Node.js cluster module here: https://nodejs.org/docs/latest/api/cluster.html#cluster_cluster
Author Manish Prasad