Seneca client-side load balancing transport.
npm install seneca-balance-client> A [Seneca.js][] transport plugin that provides various client-side
load balancing strategies, and enables dynamic reconfiguration of
client message routing.
This module is a plugin for the Seneca framework. It provides a
transport client that load balances outbound messages on a per-pattern basis.
If you're using this module, and need help, you can:
- Post a [github issue][],
- Tweet to [@senecajs][],
- Ask on the [Gitter][gitter-url].
If you are new to Seneca in general, please take a look at
[Senecajs.org][]. We have everything from tutorials to sample apps to
help get you up and running quickly.
``sh`
npm install seneca-balance-client
And in your code:
`js`
require('seneca')()
.use('balance-client', { ... options ... })
`js
require('seneca')()
.listen( {port: function () { return process.argv[2] }} )
.add('a:1', function (msg, done) {
done( null, {a: 1, x: msg.x} )
})
// run twice:
// $ node server.js 47000 --seneca.log=type:act
// $ node server.js 47001 --seneca.log=type:act
`
`js
require('seneca')()
.use('balance-client')
.client( {type: 'balance'} )
.client( {port: 47000} )
.client( {port: 47001} )
.ready( function () {
for ( var i = 0; i < 4; i++ ) {
this.act( 'a:1,x:1', console.log )
}
})
// $ node client.js --seneca.log=type:act
`
The client will balance requests over both servers using
round-robin. As there is no _pin_ in the .client configuration, this
will apply to all non-local actions. Add a _pin_ to restrict the
action patterns to which this applies - make sure to use the same
_pin_ on both client and server to avoid ambiguity.
The plugin provides two balancing models:
* consume: messages are sent to individual targets, using a round-robin approachobserve
* : messages are duplicated and sent to all targets
You specify the model using the plugin option model:
`js
var Seneca = require('seneca')
var s0 = Seneca({tag: 's0'})
.listen(44440)
.add('a:1', function (msg, done) {
console.log('s0;x='+msg.x);
done()
})
var s1 = Seneca({tag: 's1'})
.listen(44441)
.add('a:1', function (msg, done) {
console.log('s1;x='+msg.x);
done()
})
var c0 = Seneca({tag: 'c0'})
.use('..')
.client({ type: 'balance', pin: 'a:1', model: 'observe' })
.client({ port: 44440, pin: 'a:1' })
.client({ port: 44441, pin: 'a:1' })
s0.ready( s1.ready.bind(s1, c0.ready.bind(c0, function () {
c0.act('a:1,x:y')
// wait a little bit to avoid shutting down in mid flow
setTimeout(
s0.close.bind( s0, s1.close.bind(s1, c0.close.bind(c0))), 111 )
})))
`
You can also provide your own balancing model by providing a function
with signature (seneca, msg, targetstate, done) as the value of themodel setting:
`js
...
.client({
type: 'balance',
pin: 'a:1',
model: function (seneca, msg, targetstate, done) {
if (0 === targetstate.targets.length) {
return done( new Error('No targets') )
}
// select a random target
var index = Math.floor(Math.random() * targetstate.targets.length)
targetstate.targets[index].action.call( seneca, msg, done)
}
})
...
`
The targetstate object provides you with the list of currentlyobserveModel
available targets. Review the internal implementations of the and the consumeModel in
balance-client.js
for a starting point to write your own model.
The [Senecajs org][] encourages open participation. If you feel you
can help in any way, be it with documentation, examples, extra
testing, or new features please get in touch.
`sh``
npm run test
[MIT]: ./LICENSE
[npm-badge]: https://img.shields.io/npm/v/seneca-balance-client.svg
[npm-url]: https://npmjs.com/package/seneca-balance-client
[coveralls-badge]:https://coveralls.io/repos/senecajs/seneca-balance-client/badge.svg?branch=master&service=github
[coveralls-url]: https://coveralls.io/github/senecajs/seneca-balance-client?branch=master
[david-badge]: https://david-dm.org/senecajs/seneca-balance-client.svg
[david-url]: https://david-dm.org/senecajs/seneca-balance-client
[Senecajs org]: https://github.com/senecajs/
[Seneca.js]: https://www.npmjs.com/package/seneca
[@senecajs]: http://twitter.com/senecajs
[senecajs.org]: http://senecajs.org/
[travis-badge]: https://travis-ci.org/senecajs/seneca-balance-client.svg
[travis-url]: https://travis-ci.org/senecajs/seneca-balance-client
[gitter-badge]: https://badges.gitter.im/Join%20Chat.svg
[gitter-url]: https://gitter.im/senecajs/seneca
[github issue]: https://github.com/senecajs/seneca-balance-client/issues