cluster-store.js/README.md

152 lines
3.6 KiB
Markdown
Raw Normal View History

2016-09-09 00:00:53 +00:00
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
=======
```
2016-09-09 00:09:50 +00:00
npm install --save cluster-store@2.x
2016-09-09 00:00:53 +00:00
```
v1.x vs v2.x
------------
2016-09-09 00:07:30 +00:00
The [old v1](https://github.com/coolaj86/cluster-store/tree/v1.x)
used `ws` which makes it usable when clustering node processes without using `cluster`.
2016-09-09 00:00:53 +00:00
2016-09-09 00:07:30 +00:00
If you need that functionaliy, use v1 instead of v2.
2016-09-09 00:00:53 +00:00
Usage
=====
2016-09-09 00:49:31 +00:00
In its simplest form, you use this module nearly exactly the way you would
the any other storage module, with the exception that you must wait for
the inter-process initialization to complete.
When not using any of the options the usage is the same for the master and the worker:
```javascript
require('cluster-store').create().then(function (store) {
// initialization is now complete
store.set('foo', 'bar');
});
```
2016-09-09 00:00:53 +00:00
### standalone (non-cluster)
--------------
2016-09-09 00:49:31 +00:00
There is no disadvantage to using this module standalone.
The additional overhead of inter-process communication is only added when
a worker is added.
As such, the standalone usage is identical to usage in master process, as seen below.
2016-09-09 00:00:53 +00:00
### master
2016-09-09 00:49:31 +00:00
In the **master** process you will create the real store instance.
If you need to manually specify which worker will be enabled for this funcitonality
you must set `addOnFork` to `false` and call `addWorker()` manually.
2016-09-09 00:00:53 +00:00
```javascript
'use strict';
var cluster = require('cluster');
var cstore = require('cluster-store/master').create({
2016-09-09 00:49:31 +00:00
name: 'foo-store' // necessary when using multiple instances
, store: null // use default in-memory store
, addOnFork: true // default
2016-09-09 00:00:53 +00:00
});
// if you addOnFork is set to false you can add specific forks manually
//cstore.addWorker(cluster.fork());
2016-09-09 00:00:53 +00:00
cstore.then(function (store) {
store.set('foo', 'bar');
});
```
2016-09-09 00:49:31 +00:00
Note: `store` can be replaced with any `express/session`-compatible store, such as:
2016-09-09 00:07:30 +00:00
* `new require('express-session/session/memory')()`
* `require('level-session-store')(session)`
* and others
2016-09-09 00:00:53 +00:00
### worker
```javascript
'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](https://github.com/expressjs/session#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
=======
```javascript
'use strict';
var cluster = require('cluster');
2016-09-09 00:49:31 +00:00
require('cluster-store').create({
name: 'foo-store'
}).then(function (store) {
if (cluster.isMaster) {
store.set('foo', 'bar');
}
2016-09-09 00:00:53 +00:00
2016-09-09 00:49:31 +00:00
store.get('foo', function (err, result) {
console.log(result);
2016-09-09 00:00:53 +00:00
});
2016-09-09 00:49:31 +00:00
});
2016-09-09 00:00:53 +00:00
2016-09-09 00:49:31 +00:00
if (cluster.isMaster) {
cluster.fork();
cluster.fork();
2016-09-09 00:00:53 +00:00
}
```