This is a very opinionated abstraction over amqplib to help simplify the implementation of several messaging patterns on RabbitMQ.
!Important! - successful use of this library will require a conceptual knowledge of AMQP and an understanding of RabbitMQ.
- Attempt to gracefully handle lost connections and channels
- Automatically re-assert all topology on re-connection
- Support the majority of RabbitMQ's extensions
- Handle batching of acknowledgements and rejections
- Topology & configuration via JSON (thanks to @JohnDMathis!)
- Built-in support for JSON, binary and text message bodies
- Support for custom serialization
- Fault-tolerance/resilience over throughput
- Prefer "at least once delivery"
- Default to publish confirmation
- Default to ack mode on consumers
- Heterogenous services that include statically typed languages
- JSON as the default serialization provider for object based message bodies
- Connection Management - connection management
- Topology Setup - topology configuration
- Publishing Guide - publishing and requesting
- Receiving Guide - subscribing and handling of messages
- Logging - how foo-foo-mq logs
- Contributor Guide
- Code of Conduct
- Resources
- Maintainers
- Contributors
- Acknowledgements
- Change Log
- Differences From Wascally
This contrived example is here to make it easy to see what the API looks like now that documentation is broken up across multiple pages.
const rabbit = require('foo-foo-mq');
rabbit.handle('MyMessage', (msg) => {
console.log('received msg', msg.body);
msg.ack();
});
rabbit.handle('MyRequest', (req) => {
req.reply('yes?');
});
rabbit.configure({
connection: {
name: 'default',
user: 'guest',
pass: 'guest',
host: 'my-rabbitmq-server',
port: 5672,
vhost: '%2f',
replyQueue: 'customReplyQueue'
},
exchanges: [
{ name: 'ex.1', type: 'fanout', autoDelete: true }
],
queues: [
{ name: 'q.1', autoDelete: true, subscribe: true },
],
bindings: [
{ exchange: 'ex.1', target: 'q.1', keys: [] }
]
}).then(
() => console.log('connected!');
);
rabbit.request('ex.1', { type: 'MyRequest' })
.then(
reply => {
console.log('got response:', reply.body);
reply.ack();
}
);
rabbit.publish('ex.1', { type: 'MyMessage', body: 'hello!' });
setTimeout(() => {
rabbit.shutdown(true)
},5000);
- improve support RabbitMQ backpressure mechanisms
- add support for Rabbit's HTTP API