7 个版本 (破坏性更新)
0.6.0 | 2022年6月30日 |
---|---|
0.5.0 | 2022年6月10日 |
0.4.0 | 2022年5月11日 |
0.3.0 | 2021年9月21日 |
0.1.1 | 2021年8月16日 |
#1048 in 数据库接口
每月 72 次下载
55KB
1K SLoC
Requeuest
Requeuest(发音为 "recused")是一个消息队列,它作为 HTTP 请求的中介,确保发送的请求最终能够成功送达,这意味着你不需要为 HTTP API 请求实现重试逻辑。队列使用 sqlxmq
crate 将 postgres 作为消息的存储,这避免了专用消息队列服务可能宕机的可靠性风险。但这带来的权衡是,工作运行器成为库消费者的过程的一部分,并且必须保持对运行器的引用,以便可以在后台运行作业,因为作业不能委托给单独的运行器服务。
入门
假设你已经有一个到 postgres 数据库的 sqlx
连接,你首先需要运行迁移,以便在您的 postgres 数据库上设置所需的表和 SQL 函数。建议为 requeuest 使用一个单独的数据库,以避免与不同服务或库的迁移管理发生冲突。
requeuest::migrate(&pool).await?;
一旦处理完毕,开始构造一个客户端。这是你将用来生成请求以及执行后台作业的工具。它将持续这样做,直到被丢弃。客户端包含一个 tokio JoinHandle
,你可以使用 Client::take_listener
方法将其从客户端移除,如果你希望监听器在客户端丢弃后继续运行,或者直接与后台任务进行接口交互。
use requeuest::Client;
let client = Client::new(pool, &["my_service"]).await?;
客户端构造完成后,你可以开始生成作业。这里我们向一个示例地址发送一个 GET 请求
use requeuest::{HeaderMap, Request};
let request = Request::get("https://foo.bar/_api/baz".parse()?, HeaderMap::new());
client.spawn("my_service", &request).await?;
你还可以从成功送达的请求中获取响应。
// You can skip the HeaderMap import by invoking the constructor via the Default trait
let request = Request::post("https://example.com/_api/bar/foo".parse()?, Vec::from("some data"), Default::default());
let response = client.spawn_returning("my_service", &request).await?;
请注意,默认情况下,spawn_returning
方法会无限期地等待(或者更确切地说,大约 10^293 年)直到接收到成功的响应,所以如果请求发送到一个未注册的域名,或者请求到一个保证总是返回非 200 响应码的 API,这将永远等待。
测试
请求的集成测试依赖于sqlx-database-tester
,它期望有一个可用的PostgreSQL数据库,其中包含创建、编辑和删除数据库的权限。使用的数据库是通过对DATABASE_URL
环境变量中设置的PostgreSQL URL(例如:://postgres:password@localhost/
)进行设置,或者在.env
中的条目中设置。有关更多信息,请参阅sqlx-database-tester
的文档。
预提交使用
- 如果没有安装,请使用您的包管理器进行安装,或者使用
pip install --user pre-commit
- 运行
pre-commit autoupdate
以更新预提交配置以使用最新模板 - 运行
pre-commit install
将预提交钩子安装到您的本地环境中
依赖关系
~14–31MB
~515K SLoC