58 releases (22 stable)

1.5.4 Apr 1, 2024
1.5.3 Feb 11, 2024
1.5.2 Dec 23, 2023
1.5.1 Oct 31, 2023
0.4.2 Dec 23, 2022

#1073 in Asynchronous

Download history 339/week @ 2023-12-23 675/week @ 2023-12-30 982/week @ 2024-01-06 714/week @ 2024-01-13 728/week @ 2024-01-20 867/week @ 2024-01-27 660/week @ 2024-02-03 901/week @ 2024-02-10 956/week @ 2024-02-17 964/week @ 2024-02-24 1034/week @ 2024-03-02 1767/week @ 2024-03-09 1425/week @ 2024-03-16 1283/week @ 2024-03-23 1618/week @ 2024-03-30 1081/week @ 2024-04-06

5,658 downloads per month
Used in 8 crates (4 directly)

MIT license

410KB
9K SLoC

ci codecov Documentation crates.io Discord

What is "amqprs"

Yet another RabbitMQ client implementation in rust with different design goals.

The library is accepted to list in RabbitMQ official website.

It's probably the best performance among existing Rust clients. See Benchmarks.

Design Philosophy

  1. API first: easy to use and understand. Keep the API similar as python client library so that it is easier for users to move from there.
  2. Minimum external dependencies: as few external crates as possible.
  3. lock free: no mutex/lock in client library itself.

Design Architecture

Lock-free Design

Quick Start: Consume and Publish

// open a connection to RabbitMQ server
let connection = Connection::open(&OpenConnectionArguments::new(
    "localhost",
    5672,
    "user",
    "bitnami",
))
.await
.unwrap();
connection
    .register_callback(DefaultConnectionCallback)
    .await
    .unwrap();

// open a channel on the connection
let channel = connection.open_channel(None).await.unwrap();
channel
    .register_callback(DefaultChannelCallback)
    .await
    .unwrap();

// declare a queue
let (queue_name, _, _) = channel
    .queue_declare(QueueDeclareArguments::default())
    .await
    .unwrap()
    .unwrap();

// bind the queue to exchange
let routing_key = "amqprs.example";
let exchange_name = "amq.topic";
channel
    .queue_bind(QueueBindArguments::new(
        &queue_name,
        exchange_name,
        routing_key,
    ))
    .await
    .unwrap();

//////////////////////////////////////////////////////////////////
// start consumer with given name
let args = BasicConsumeArguments::new(
        &queue_name,
        "example_basic_pub_sub"
    );

channel
    .basic_consume(DefaultConsumer::new(args.no_ack), args)
    .await
    .unwrap();

//////////////////////////////////////////////////////////////////
// publish message
let content = String::from(
    r#"
        {
            "publisher": "example"
            "data": "Hello, amqprs!"
        }
    "#,
)
.into_bytes();

// create arguments for basic_publish
let args = BasicPublishArguments::new(exchange_name, routing_key);

channel
    .basic_publish(BasicProperties::default(), content, args)
    .await
    .unwrap();


// channel/connection will be closed when drop.
// keep the `channel` and `connection` object from dropping
// before pub/sub is done.
time::sleep(time::Duration::from_secs(1)).await;
// explicitly close
channel.close().await.unwrap();
connection.close().await.unwrap();

Typical Examples

Example - Publish and Subscribe

Example - SSL/TLS

Optional Features

  • "traces": enable tracing in the library.
  • "compliance_assert": enable compliance assertion according to AMQP spec. If enabled, library always check user inputs and panic if any non-compliance. If disabled, then it relies on server to reject.
  • "tls": enable SSL/TLS.
  • "urispec": enable support of RabbitMQ URI Specification

Run Test Locally

Testing depends on RabbitMQ docker container.

# start rabbitmq server
./start_rabbitmq.sh

# run tests
./regression_test.sh

# enable traces in test.
# Note that it only takes effect if "traces" feature is enabled
RUST_LOG=debug ./regression_test.sh

Benchmarks

See benchmarks's README

Community Feedbacks

Luc Georges @ Hugging Face

I've put amqprs in production and it's working very nicely so far! I've had spikes of publish and delivery over 10k msg/sec without breaking a sweat

Michael Klishin @ RabbitMQ team

We usually add new clients after they get some traction in the community. But this client seems to be fairly well documented and I like the API (it is a bit complicated with some other Rust clients)

Dependencies

~3–17MB
~194K SLoC