Picom(pico-message) is a high performance, self-discovery(nats.io), micro services communication layer.
Picom uses (nats.io) to send messages between services.
Each service has a name, and exposed methods.
Services sharing the same name, are expected to expose the same methods and be the same, because they will be load balanced.
Each message is a JSON, and it's expected to be relatively small (a few kb's).
npm install picom
Then, on device 1:
var Picom = require('picom');
var service1 = new Picom('service1');
service1.expose({
add: function(msg) {
return Promise.reslove({hello: 'from service 1', result: msg.a + msg.b});
},
returnError: function(msg) {
return Promise.reject('something went wrong');
}
});
On device 2:
var Picom = require('picom');
var service2 = new Picom('service2');
service2.request('service1.add', {
a: 2,
b: 5
}).then(function(msg) {
// Prints 7
console.log(msg.result);
});
myService.request('service1.returnError').
catch(function(err) {
// err is instance of Error with message: 'something went wrong'
console.log(err);
});
Initialize a new picom service.
Parameters:
- servers ([String], default: ['127.0.0.1:4222']): Nats.io address
- ttl (Integer, default: 30): After how many seconds of no response the server is considered "failing"
- retries (Integer, default: 3): How many times try reconnect (to different hosts)
- port (Integer, default: random): Used to specify a port, if omitted, a random port will be chosen
Expose methods and start listening.
Usage
myService.expose({
add: function(msg) {
return Promise.resolve(msg.a + msg.b);
}
});
Send request to remote service
Parameters:
- service (String, mandatory): Service name + method name, like 'serviceName.methodName'
- msg (Object, optional): Will become msg in remote service
- options (Object, options): for now, you can only define request timeout
Usage
// Service 1
const Picom = require('picom');
const service1 = new Picom('service1');
service1.expose({
add: function(msg) {
return Promise.resolve({result: msg.a + msg.b});
}
});
// Service 2
const Picom = require('picom');
const service2 = new Picom('service2');
service2.request('service1.add', {
a: 2,
b: 5
}, {
timeout: 30 * 1000 // 30 seconds timeout
}
});
Send request to remote service, without waiting for a reply
Parameters:
- service (String, mandatory): Service name + method name, like 'serviceName.methodName'
- msg (Object, optional): Will become msg in remote service
Usage
const Picom = require('picom');
const service1 = new Picom('service1');
service1.expose({
fib: function(msg) {
// Do heavy lifting calculations, then notify service2, using picom or other channel
}
});
const Picom = require('picom');
const service2 = new Picom('service2');
service2.publish('service1.fib', {
x: 9000
}
});
Inform nats.io to not send anymore requests here, and disconnect.