amqp-simple-pub-sub
v1.2.2
Published
A Pub Sub system that uses AMQP Messaging to exchange data between services
Downloads
186
Maintainers
Readme
AMQP Simple Pub Sub
A Pub Sub system that uses AMQP
messaging to exchange data between services.
To Use
You project needs to be using at least Node version 10, and ideally Node 18 (LTS) or later.
npm install amqp-simple-pub-sub
Create a Publisher
const { makePublisher } = require('amqp-simple-pub-sub')
const publisher = makePublisher({ exchange: 'testService' })
Publish a message
await publisher.start()
publisher.publish('test', 'Hello World')
Create a Subscriber
const { makeSubscriber } = require('amqp-simple-pub-sub')
const subscriber = makeSubscriber({
exchange: 'testService',
queueName: 'testQueue',
routingKeys: ['test']
})
Subscribe to a queue and listen for messages
const handler = message => {
console.log('Message Received', message)
subscriber.ack(message)
}
subscriber.start(handler)
Publisher
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`
}
Subscriber
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`
}
Other Options
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.js
credentials
keepAlive
keepAliveDelay
noDelay
servername
timeout
Examples
See some examples in the tests, and also:
- competing-services-example
- And the associated article: itnext.io/connecting-competing-microservices-using-rabbitmq
Related Projects
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.
Development
Branches
| Branch | Tests | Code Coverage | Audit | Comments |
| ------ | ----- | ------------- | ----- | -------- |
| develop
| | | | Work in progress |
| main
| | | | Latest release |
Prerequisites
- NodeJS, 10.0+ (I use
nvm
to manage Node versions —brew install nvm
.) - Docker (Use Docker for Mac, not the homebrew version)
Initialisation
npm install
To Start the queue server for integration testing
docker compose up -d
Runs Rabbit MQ.
Test it
npm test
— runs the unit tests (quick and does not needrabbitmq
running)npm run test:unit:cov
— runs the unit tests with code coverage (does not needrabbitmq
)npm run test:integration
— runs the integration tests (needsrabbitmq
)
Lint it
npm run lint
Contributing
Please see the contributing notes.