6 个版本
0.4.0 | 2024年1月1日 |
---|---|
0.3.3 | 2023年3月23日 |
0.0.1 | 2022年12月19日 |
#549 in 数据库接口
每月 24 次下载
210KB
5K SLoC
阿基米德
不适用于生产环境
Graphile Worker 的 Rust 重写。如果您喜欢这个库,请赞助 Benjie 项目,所有研究都由他完成,这个库只是 Rust 中的重写 🦀。端口应该与 graphile-worker
大部分兼容(这意味着您可以在 Node.JS 旁边运行它)。
以下与 Graphile Worker
不同
- 不支持批量作业
- 在
Graphile Worker
中,每个进程都有自己的 worker_id。在 Rust 中只有一个 worker_id,然后作业在您的异步运行时线程中处理。
Rust 运行的 PostgreSQL 任务队列 - 允许您在“后台”运行作业(例如发送电子邮件、执行计算、生成 PDF 等),这样您的 HTTP 响应/应用程序代码就不会被阻塞。可以与任何基于 PostgreSQL 的应用程序一起使用。
将工作器添加到您的项目
cargo add archimedes
创建任务并运行工作器
任务的定义简单地由一个异步函数和一个任务标识符组成
use serde::{Deserialize, Serialize};
use archimedes::{task, WorkerContext};
#[derive(Deserialize, Serialize)]
struct HelloPayload {
name: String,
}
#[task]
async fn say_hello(payload: HelloPayload, _ctx: WorkerContext) -> Result<(), ()> {
println!("Hello {} !", payload.name);
Ok(())
}
#[tokio::main]
async fn main() -> Result<(), ()> {
archimedes::WorkerOptions::default()
.concurrency(2)
.schema("example_simple_worker")
.define_job(say_hello)
.pg_pool(pg_pool)
.init()
.await?
.run()
.await?;
Ok(())
}
通过 SQL 安排作业
连接到您的数据库并运行以下 SQL
SELECT archimedes_worker.add_job('say_hello', json_build_object('name', 'Bobby Tables'));
通过 RUST 安排作业
#[tokio::main]
async fn main() -> Result<(), ()> {
// ...
let helpers = worker.create_helpers();
// Using add_job forces the payload to be same struct defined in our type
helpers.add_job::<say_hello>(
HelloPayload { name: "world".to_string() },
Default::default(),
).await.unwrap();
// You can also use `add_raw_job` if you don't have access to the task, or don't care about end 2 end safety
helpers.add_raw_job("say_hello", serde_json::json!({ "message": "world" }), Default::default()).await.unwrap();
Ok(())
}
成功!
您应该看到工作器输出了 Hello Bobby Tables !
。哇,这真快!
特性
- 独立和嵌入式模式
- 设计用于从 JavaScript 或直接在数据库中使用的
- 易于测试(建议:`runTaskListOnce` 工具)
- 低延迟(通常从任务安排到执行的时间低于 3ms,使用
LISTEN
/NOTIFY
来通知作业插入时的情况) - 高性能(使用
SKIP LOCKED
来查找要执行的作业,从而实现更快的检索) - 小型任务(使用显式任务名称/有效负载,从而实现最小的序列化/反序列化开销)
- 默认并行
- 向具有相同名称的队列添加作业将按顺序运行
- 自动使用指数退避重新尝试失败的作业
- 可自定义的重试次数(默认:约3天内25次尝试)
- 类似Crontab的重复任务调度功能(可选回补)
- 通过唯一的
job_key
进行任务去重 - 使用“批量作业”将数据附加到已入队的作业
- 开源;自由MIT许可
- 执行用Rust编写的任务(这些可以调用任何其他语言或网络服务)
- 原生用Rust编写
- 如果您运行非常轻量级,可以将Archimedes与您的服务器相同的Node进程一起运行,以降低成本和DevOps复杂性。
状态
不为生产就绪(自行承担风险使用)。
要求
PostgreSQL 12+ 可能与较旧版本兼容,但未进行测试。
注意:需要Postgres 12才能使用generated always as (expression)
功能
安装
cargo add archimedes
运行
archimedes
管理自己的数据库模式(archimedes_worker
)。只需指向您的数据库,我们将处理自己的迁移。
依赖项
~39–53MB
~1M SLoC