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 数据库接口

Download history 1/week @ 2024-03-26 23/week @ 2024-04-02

每月 72 次下载

AGPL-3.0-only

55KB
1K SLoC

Rust 593 SLoC // 0.0% comments SQL 411 SLoC // 0.1% comments

Requeuest

pipeline status coverage report documentation (docs.rs) documentation (main)

requeuest logo

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的文档。

预提交使用

  1. 如果没有安装,请使用您的包管理器进行安装,或者使用pip install --user pre-commit
  2. 运行pre-commit autoupdate以更新预提交配置以使用最新模板
  3. 运行pre-commit install将预提交钩子安装到您的本地环境中

依赖关系

~14–31MB
~515K SLoC