I have working (stock) script from node
var cluster = require('cluster');
var http = require('http');
var numReqs = 0;
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < 2; i++) {
var worker = cluster.fork();
worker.on('message', function(msg) {
if (msg.cmd && msg.cmd == 'notifyRequest') {
numReqs++;
}
});
}
setInterval(function() {
console.log("numReqs =", numReqs);
}, 1000);
} else {
// Worker processes have a http server.
http.Server(function(req, res) {
res.writeHead(200);
res.end("hello world\n");
// Send message to master process
process.send({ cmd: 'notifyRequest' });
}).listen(8000);
}
In the above script I can send data from worker to master process with ease. But how to send data from master to the worker/workers? With examples, if it possible.
I found this thread while looking for a way to send a message to all child processes and was thankfully able to figure it out thanks to the comments about arrays. Just wanted to illustrate a potential solution for sending a message to all child processes utilizing this approach.
You should be able to send a message from the master to the worker like this:
because "cluster.fork is implemented on top of child_process.fork" (cluster.fork is implemented on top of child_process.fork)
Because cluster.fork is implemented on top of child_process.fork, you can send messages from a master to the worker by using
worker.send({ msg: 'test' })
, and from a worker to a master byprocess.send({ msg: 'test' });
. You receive the messages like so:worker.on('message', callback)
(from worker to master) andprocess.on('message', callback);
(from master to worker).Here's my full example, you can test it by browsing http://localhost:8000/ Then the worker will send a message to the master and the master will reply:
I understand your purpose of broadcasting to all the node worker processes in a cluster, although you can not send socket component as such but there is a work around for the purpose to be served. I will try an explain with an example :
Step 1 : When a client action requires a broadcast :
Step 2 : On the cluster creation side
Step 3: To Broadcast in the child process -
-> Put this before io.on("connection") in Child.js
I hope this helps. Please let me know if more clarification is required.
Here's how I implemented a solution to a similar problem. By hooking into
cluster.on('fork')
, you can attach message handlers to workers as they are forked (rather than storing them in an array), which has the added advantage of dealing with cases where workers die or disconnect and a new worker is forked.This snippet would send a message from the master to all workers.