#任务队列 #PostgreSQL #任务队列 #作业 #进程 #工作器 #SQL数据库

archimedes

高性能的 Rust/PostgreSQL 任务队列(也适用于将 PostgreSQL 触发器/函数生成的作业输出到不同的工作队列)

6 个版本

0.4.0 2024年1月1日
0.3.3 2023年3月23日
0.0.1 2022年12月19日

#549 in 数据库接口

每月 24 次下载

MIT 许可证

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