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 在 网络编程 中排名
每月 8,011 次下载
用于 9 个 Crates(直接使用 5 个)
420KB
9K SLoC
MSRV
- 版本 >=
v1.7.0
,msrv 是1.64
- 版本 <
v1.7.0
:msrv 是1.56
什么是 "amqprs"?
又一个 Rust 编写的 RabbitMQ 客户端实现,具有不同的设计目标。
该库已被列入 RabbitMQ 官方网站 的列表。
它可能是现有 Rust 客户端中性能最好的。请参阅 基准测试。
设计理念
- API 优先:易于使用和理解。保持 API 与 Python 客户端库相似,以便用户更容易迁移。
- 最小外部依赖:尽可能少的外部 crate。
- 无锁:客户端库本身没有互斥锁/锁。
设计架构
快速入门:消费和发布
// 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
基准测试
社区反馈
Luc Georges @ Hugging Face
我已经将amqprs投入生产,目前为止运行得非常好!在发布和交付方面,我经历了超过10k消息/秒的高峰,但并未感到压力
Michael Klishin @ RabbitMQ 团队
我们通常在客户端在社区中获得一些影响力后添加新的客户端。但这个客户端似乎有很好的文档,我喜欢它的API(与其他Rust客户端相比,它有些复杂)
依赖项
~3–13MB
~154K SLoC