A wrapper to enable the use of any in-process store with node cluster via cluster process and worker messages (i.e. for Raspberry Pi servers).
Go to file
AJ ONeal f07410bc14 v2.0.0 2016-09-08 18:00:53 -06:00
.gitignore v2.0.0 2016-09-08 18:00:53 -06:00
LICENSE v2.0.0 2016-09-08 18:00:53 -06:00
README.md v2.0.0 2016-09-08 18:00:53 -06:00
index.js v2.0.0 2016-09-08 18:00:53 -06:00
master.js v2.0.0 2016-09-08 18:00:53 -06:00
memstore.js v2.0.0 2016-09-08 18:00:53 -06:00
package.json v2.0.0 2016-09-08 18:00:53 -06:00
test.js v2.0.0 2016-09-08 18:00:53 -06:00
worker.js v2.0.0 2016-09-08 18:00:53 -06:00

README.md

cluster-store

Makes any storage strategy similar to express/session useful in both cluster and non-cluster environments by wrapping it with cluster-rpc.

Also works with level-session-store (leveldb), connect-session-knex (SQLite3), session-file-store (fs), and any other embedded / in-process store.

Note: Most people would probably prefer to just use Redis rather than wrap a dumb memstore as a service... but I am not most people.

Install

npm install --save memstore-cluster@2.x

v1.x vs v2.x

The old v1 used ws which makes it usable when clustering node processes without using cluster.

If you need that functionaliy, use it.

Usage

standalone (non-cluster)


The usage is exactly the same as master, no changes necessary.

master

In the master/standalone process you will create the real store instance and then in the you must pass each worker via addWorker() so that it signals the worker to create its own rpc-wrapped instance.

'use strict';

var cluster = require('cluster');

var cstore = require('cluster-store/master').create({
  name: 'foo-store'
});

cstore.addWorker(cluster.fork());

cstore.then(function (store) {
  store.set('foo', 'bar');
});

worker

'use strict';

// retrieve the instance
var cstore = require('cluster-store/worker').create({
  name: 'foo-store'
});

cstore.then(function (store) {
  store.get('foo', function (err, result) {
    console.log(result);
  });
});

API

This is modeled after Express' Session Store Implementation

Note: These are only exposed if the underlying store supports them.

CRUD methods

  • store.set(id, data, fn) => (error)
  • store.get(id, fn) => (error, data)
  • store.touch(id, data, fn) => (error)
  • store.destroy(id, fn) => (error)

Helpers

  • store.all(fn) => (error, array)
  • store.clear(fn) => (error)
  • store.length(fn) => (error, length)

See https://github.com/expressjs/session#session-store-implementation@4.x for full details

Example

'use strict';

var cluster = require('cluster');
var cstore;


if (cluster.isMaster) {


  cstore = require('./master').create({
    name: 'foo-level'
  });
  cstore.addWorker(cluster.fork());
  cstore.then(function (store) {
    store.put('foo', 'bar');
  });


}
else {


  cstore = require('./worker').create({
    name: 'foo-level'
  });


}


cstore.then(function (store) {
  setTimeout(function () {
    store.get('foo', function (err, result) {
      console.log(cluster.isMaster && '0' || cluster.worker.id.toString(), "store.get('foo')", result);

      if (!cluster.isMaster) {
        process.exit(0);
      }
    });
  }, 250);
});

process.on('unhandledRejection', function (err) {
  console.log('unhandledRejection', err);
});