Frodo.io
Introduction
Sync your request to the same node with frodo.
Frodo.io uses etcd and hashring to provide you with a server by some key.
Simple use case: clustered database that accessed by a clustered layer that wraps it. The changes on an entity should go through the same server to prevent inconsistency.
How to use
Simple test app that register servers and then uses them to get id would be:
var Frodo = require('frodoio');
var frodo = new Frodo({ context: 'appname', etcdServers: [ { host: '127.0.0.1', port: 4001 } ]});
Q.all(frodo.addServer('dataacess1:3030'),
frodo.addServer('dataacess2:3030'),
frodo.addServer('dataacess3:3030')).then(function () {
frodo.serverById(function (server) {
request.put('http://' + server + '/entity');
});
});
But this application does not make any sense, because you probably want to addServer from the server and run serverById from the client.
Server:
var Frodo = require('frodoio');
var frodo = new Frodo({ context: 'appname', etcdServers: [ { host: '127.0.0.1', port: 4001 } ]});
var ip = _.chain(require('os').networkInterfaces()).flatten().filter(function(val){ return (val.family == 'IPv4' && val.internal == false) }).pluck('address').first().value();
var me = ip + ':3030';
function start(done) {
frodo.addServer(me).then(done);
}
function stop(done) {
frodo.removeServer(me).then(function () {
frodo.close().then(done);
});
}
Client:
var Frodo = require('frodoio');
var frodo = new Frodo({ context: 'appname', etcdServers: [ { host: '127.0.0.1', port: 4001 } ]});
frodo.serverById(function (server) {
request.put('http://' + server + '/entity');
});
Any comments/suggestions/pull requests would be appreciated!
License
Apache