nsq-service
v0.1.1
Published
Inner service wrapper using NSQ, help to host distributed modules by communicating through NSQ
Downloads
4
Maintainers
Readme
Introduction
A Micro-Service architecture solution using MessageQueue (Currently, mainly using NSQ)
Quick start
####1. build business logic of each module in its manager.js
file with fixed parameter formation: must contain 2 parameters, first is the data object, second is the callback function
The manager.js
file should look like this:
module.exports = {
some_api : function( parameterObject, callback ){
// some business logic
// ...
},
some_other_api: function( parameterObject, callback ){
// some other business logic
// ...
},
// ...
}
It's just suggested to use manager.js
as the business logic file name, to compliant with the concept of manager
which will be used in the later step
####2. Setup the NSQ configurations The configuration should look like this:
nsqServiceConfig: {
address: '127.0.0.1', // NSQ server address
writerPort: 4150, // NSQ writer port, default is 4150
readerPort: 4150, // NSQ reader port, default is 4150
maxInFlight: 1, // NSQ parameter `maxInFlight`
maxAttempts: 5, // NSQ parameter `maxAttempts`
producerQueue: 'auth', // Define the name of `producer` queue
customerQueue: 'auth-cust',// Define the name of `customer` queue
channel: 'main' // Default NSQ Channel is `main`
}
####3. Start NSQ-Service
In the very beginning of your project entry file, normally is app.js
,
var app = require('express') // or restify, koa, etc.
// ...
var NS = require('nsq-service')
NS.queue.setConfig( nsqServiceConfig ) // the config object defined above
NS.handler.addManager(require('./PATH/TO/MANAGER')) // add some manager
NS.handler.ready( function() {
// NSQ-service need to be ready before start the local service
// ...
app.listen(3000)
})
Concepts
####1. Producer
and Customer
Every module in a distributed architecture is a Producer
and at the mean time, is a Customer
too. The communication sequence is:
(1) module[A]
want to invoke an api
of module[B]
,
module[A]
will send a message to module[B]
's producerQueue
,
in that message,
information of module[A]
's customerQueue
is attached
(2) module[B]
receive that message from module[A]
,
parse the api
and arguments out,
invoke the specified api with those arguments,
when finished,
module[B]
send the result back to module[A]
's customerQueue
,
according to the attached information
(3) module[A]
receive the execution result,
from its customerQueue
,
and then execute the coresponding callback
####2. MessageID
and Async
Every message contains a MessageID
, which is composed by timestamp, machine name, and random numbers, it's very hard to get collision even in millions messages per second
Every message is executed asynchronously