#rabbitmq #amqp #consumer #lapin #configuration #abstraction #templating

rabbit_borough

Create a RabbitMQ consumer project with minimal effort, by bypassing templating, configuration and complicated resiliency logic

10 releases

0.1.7 Oct 4, 2022
0.1.6 Oct 5, 2020
0.1.5 Aug 7, 2020
0.1.4 Jul 5, 2020
0.1.3-beta.5 Jun 23, 2020

#658 in Asynchronous

MIT license

22KB
487 lines

Rabbit-Borough

Rust A rabbit MQ abstraction build upon Lapin

Consumer example

fn main() {
    let config: JSONConfiguration = configuration::reader::read("./config.json").unwrap();
    println!("[{}] - Configuration read", line!(),);

    LocalPool::new().run_until(async {
        consume(&config, &handler).await;
    })
}

fn handler(_delivery: &DeliveredMessage) -> HandleMessageResult {
    // In order to read the message you need to convert the _delivery.data from a u8 vec to a utf8 string :
    // std::str::from_utf8(&_delivery.data))
    return HandleMessageResult::Ack;
}

Publisher example

fn main() {
    let config: JSONConfiguration = configuration::reader::read("./config.json").unwrap();
    println!("[{}] - Configuration read", line!(),);

    LocalPool::new().run_until(async {
        loop {
            let outcome = publish(
                "test".to_string(),
                &config.binding.exchange,
                &config.binding.routing_key,
                config.connection.clone(),
            )
            .await;

            println!("[{}] - {:?}", line!(), outcome);

            let delay = time::Duration::from_millis(500);
            thread::sleep(delay);
        }
    });
}

JSONConfiguration configuration example

The entire configuration supports default implementations. So if the default assumptions are right for you don't need to provide the entire config, only the parts you are interested in.

This is a full example

{
    "connection": {
        "host": "127.0.0.1",
        "port": 5672,
        "vhost": "/",
        "heartbeat": 10,
        "connection_timeout": 1000,
        "username": "secure",
        "password": "secure",
        "retry": 4
    },
    "binding": {
        "queue": "myQueue",
        "exchange": "myExchange",
        "routing_key": "myKey",
        "exchange_declaration_options": {
            "passive": false,
            "durable": true,
            "auto_delete": false
        }
    },
    "declare": {
        "queue": true,
        "exchange": true,
        "binding": true
    }
}

More examples

For more examples go to the repository at examples

Examples include

  • simple consumer
  • consumer using a postgres connection pool
  • consumer with options
  • simple publisher
  • publisher with message type

Idea

The whole idea is basically to be able to create a consumer project with minimal effort, by bypassing templating, configuration and complicated resiliency logic.

But most of the modules are public in this abstraction, so as to left some breathing space for custom composing.

Thoughts

Given that I use rabbitMq daily in nearly every application, this mini library is something that I might benefit in the near future. Luckily someone could find similar benefit as well.

Dependencies

~8–21MB
~284K SLoC