Skip to content
Easily and efficiently sync data in your cluster applications.
Latest commit 5a4d640 Sep 26, 2015 @fent remove node v0.6 install
Failed to load latest commit information.
lib code style change Sep 26, 2015
test code style change Sep 26, 2015
.gitignore first commit Feb 11, 2012
.travis.yml use container-based infrastructure Sep 26, 2015
LICENSE first commit Feb 12, 2012 remove node v0.6 install Sep 26, 2015
package.json 0.2.7 Sep 26, 2015


An attempt at giving multi process node programs a simple and efficient way to share data.

Build Status Dependency Status


var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
var hub = require('clusterhub');

if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {

} else {
  hub.on('event', function(data) {
    // do something with `data`

  // emit event to all workers
  hub.emit('event', { foo: 'bar' });


  • Efficient event emitter system. Clusterhub will waste no time sending an event to a process that isn't listening for it. Events from the same process of a listener will be immediately emitted.
  • In process database. Each hub has its own instance of a redis-like database powered by EventVat.
  • Cluster agnostic. Apps that use clusterhub will work regardless if it uses cluster or not.


Node.js is a perfect candidate to developing Date Intensive Real-time Applications. Load balancing in these applications can become complicated when having to share data between processes.

A remote database can be an easy solution for this, but it's not the most optimal. Communicating with a local process is several times faster than opening remote requests from a database. And even if the database is hosted locally, the overhead of communicating with yet another program is lessened.

Note that this module is still experimental. It currently works by using a process's internal messaging system.

Made with Clusterhub



Clusterhub already comes with a default global hub. Use this if you want to create a custom hub.


Call to disable hub from emitting and receiving remote messages/commands.

Additionally, all functions from the regular EventEmitter are included. Plus a couple of extras.

Hub#emitLocal(event, [args...])

Use this to emit an event only to the current process.

Hub#emitRemote(event, [args...])

Use this to emit an event only to other worker processes and master. Or only to workers if the current process is the master.

hub.on('remotehello', function() {
  // hello from another process

hub.emitRemote('remotehello', { hello: 'there' });

All functions from EventVat are included as well. Their returned value can be accessed by providing a callback as the last argument. Or optionally by its returned value if called by the master.

worker process

hub.set('foo', 'bar', function() {
  hub.get('foo', function(val) {
    console.log(val === 'bar'); // true

master process

var returnedVal = hub.incr('foo', function(val) {
  // can be given a callback for consistency
  console.log(val === 1); // true

// but since it's the master process it has direct access to the database
console.log(returnedVal === 1); // true


npm install clusterhub


Tests are written with mocha

npm test



Something went wrong with that request. Please try again.