63 个版本 (27 个稳定版)

1.7.0 2024 年 8 月 3 日
1.6.3 2024 年 7 月 22 日
1.6.2 2024 年 6 月 14 日
1.5.3 2024 年 2 月 11 日
0.4.2 2022 年 12 月 23 日

#46网络编程 中排名

Download history 1836/week @ 2024-05-03 2538/week @ 2024-05-10 1924/week @ 2024-05-17 2335/week @ 2024-05-24 2107/week @ 2024-05-31 2300/week @ 2024-06-07 2464/week @ 2024-06-14 2374/week @ 2024-06-21 2281/week @ 2024-06-28 2221/week @ 2024-07-05 2250/week @ 2024-07-12 1825/week @ 2024-07-19 2161/week @ 2024-07-26 2236/week @ 2024-08-02 1929/week @ 2024-08-09 1336/week @ 2024-08-16

每月 8,011 次下载
用于 9 个 Crates(直接使用 5 个)

MIT 许可证

420KB
9K SLoC

ci codecov Documentation crates.io Discord

MSRV

  • 版本 >= v1.7.0,msrv 是 1.64
  • 版本 < v1.7.0:msrv 是 1.56

什么是 "amqprs"?

又一个 Rust 编写的 RabbitMQ 客户端实现,具有不同的设计目标。

该库已被列入 RabbitMQ 官方网站 的列表。

它可能是现有 Rust 客户端中性能最好的。请参阅 基准测试

设计理念

  1. API 优先:易于使用和理解。保持 API 与 Python 客户端库相似,以便用户更容易迁移。
  2. 最小外部依赖:尽可能少的外部 crate。
  3. 无锁:客户端库本身没有互斥锁/锁。

设计架构

Lock-free Design

快速入门:消费和发布

// 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();

典型示例

示例 - 发布和订阅

示例 - SSL/TLS

可选功能

  • "traces": 启用库中的 tracing
  • "compliance_assert": 启用根据 AMQP 规范的合规性断言。如果启用,库将始终检查用户输入并在任何不合规的情况下 panic。如果禁用,则依赖服务器拒绝。
  • "tls": 启用 SSL/TLS。
  • "urispec": 启用对 RabbitMQ URI 规范 的支持。

在本地运行测试

测试依赖于 RabbitMQ docker 容器。

# 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

基准测试

查看基准测试的 README

社区反馈

Luc Georges @ Hugging Face

我已经将amqprs投入生产,目前为止运行得非常好!在发布和交付方面,我经历了超过10k消息/秒的高峰,但并未感到压力

Michael Klishin @ RabbitMQ 团队

我们通常在客户端在社区中获得一些影响力后添加新的客户端。但这个客户端似乎有很好的文档,我喜欢它的API(与其他Rust客户端相比,它有些复杂)

依赖项

~3–13MB
~154K SLoC