rabbot

Abstractions to simplify working with the RabbitMQ

  • rabbot

Downloads in past

Stats

StarsIssuesVersionUpdatedCreatedSize
rabbot
279382.1.05 years ago7 years agoMinified + gzip package size for rabbot in KB

Readme

rabbot
!Build Statustravis-imagetravis-url !Coverage Statuscoveralls-imagecoveralls-url !Version npmversion-imageversion-url !npm Downloadsdownloads-imagedownloads-url !Dependenciesdependencies-imagedependencies-url
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.

Features:

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

Assumptions & Defaults:

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

Documentation You Should Read

Topology Setup - topology configuration Publishing Guide - publishing and requesting Receiving Guide - subscribing and handling of messages Logging - how rabbot logs

Other Documents

Contributor Guide Code of Conduct Resources Maintainers Contributors Acknowledgements Change Log Differences From Wascally

Demos

pubsub

API Example

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('rabbot');

rabbot.handle('MyMessage', (msg) => {
  console.log('received msg', msg.body);
  msg.ack();
});

rabbot.handle('MyRequest', (req) => {
  req.reply('yes?');
});

rabbot.configure({
  connection: {
    name: 'default',
    user: 'guest',
    pass: 'guest',
    host: 'my-rabbot-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!');
);

rabbot.request('ex.1', { type: 'MyRequest' })
  .then(
    reply => {
      console.log('got response:', reply.body);
      reply.ack();
    }
  );

rabbot.publish('ex.1', { type: 'MyMessage', body: 'hello!' });


setTimeout(() => {
  rabbot.shutdown(true)
},5000);

Roadmap

improve support RabbitMQ backpressure mechanisms add support for Rabbit's HTTP API