A Pub Sub system that uses AMQP messaging to exchange data between services.
You project needs to be using at least Node version 10, and ideally Node 18 (LTS) or later.
npm install amqp-simple-pub-subconst { makePublisher } = require('amqp-simple-pub-sub')
const publisher = makePublisher({ exchange: 'testService' })await publisher.start()
publisher.publish('test', 'Hello World')const { makeSubscriber } = require('amqp-simple-pub-sub')
const subscriber = makeSubscriber({
exchange: 'testService',
queueName: 'testQueue',
routingKeys: ['test']
})const handler = message => {
console.log('Message Received', message)
subscriber.ack(message)
}
subscriber.start(handler)The full options object is as follows
{
type: 'topic', // the default
url: 'amqp://localhost', // the default
exchange: 'you must provide this', // it's the name of your service usually
onError: err => { // optional
console.error('A connection error happened', err) // or do something clever
},
onClose: () => { // optional
console.log('The connection has closed.') // or do something clever
},
...otherOptions // anything else you pass in gets passed directly to `amqp.connect`
}The full options object is as follows
{
type: 'topic', // the default
url: 'amqp://localhost', // the default
exchange: 'you must provide this', // it's the name of your service usually
queueName: 'you must also provide this', // give your queue a name
routingKeys: ['an', 'array', 'of', 'routingKeys'], // optional. Uses [queueName] otherwise.
onError: err => { // optional
console.error('A connection error happened', err) // or do something clever
},
onClose: () => { // optional
console.log('The connection has closed.') // or do something clever
},
...otherOptions // anything else you pass in gets passed directly to `amqp.connect`
}As outlined above both createPublisher and createPublisher also accept other options.
These are passed straight onto amqp.connect under the hood. The options are:
clientProperties: seeconnect.jscredentialskeepAlivekeepAliveDelaynoDelayservernametimeout
See some examples in the tests, and also:
- competing-services-example
- And the associated article: itnext.io/connecting-competing-microservices-using-rabbitmq
amqp-delegate— A library that simplifies, to the point of triviality, use of AMQP based remote workers.ampq-event-tester— A Dockerised and configurable utility to help integration-test your AMQP services.
| Branch | Tests | Code Coverage | Audit | Comments |
|---|---|---|---|---|
develop |
Work in progress | |||
main |
Latest release |
- NodeJS, 10.0+ (I use
nvmto manage Node versions —brew install nvm.) - Docker (Use Docker for Mac, not the homebrew version)
npm installdocker compose up -dRuns Rabbit MQ.
npm test— runs the unit tests (quick and does not needrabbitmqrunning)npm run test:unit:cov— runs the unit tests with code coverage (does not needrabbitmq)npm run test:integration— runs the integration tests (needsrabbitmq)
npm run lintPlease see the contributing notes.
