#job-processing #background-jobs #background-processing #postgresql #sqlite #mysql #apalis

apalis-sql

为apalis提供SQL存储。使用sqlite、postgres和mysql进行后台作业处理

34次发布

0.6.0-rc.52024年7月25日
0.6.0-alpha.02024年6月30日
0.5.1 2024年3月13日
0.4.7 2023年11月18日
0.2.0 2021年5月14日

#224 in 异步

Download history 2912/week @ 2024-04-28 2220/week @ 2024-05-05 2958/week @ 2024-05-12 2872/week @ 2024-05-19 3365/week @ 2024-05-26 2742/week @ 2024-06-02 2343/week @ 2024-06-09 2962/week @ 2024-06-16 3033/week @ 2024-06-23 1745/week @ 2024-06-30 2673/week @ 2024-07-07 2531/week @ 2024-07-14 2537/week @ 2024-07-21 2133/week @ 2024-07-28 2429/week @ 2024-08-04 2603/week @ 2024-08-11

9,775 每月下载量
用于 5 个crate(通过 apalis

MIT 协议

270KB
6K SLoC

apalis

为Rust提供的简单、可扩展的多线程后台作业和消息处理库


功能

  • 简单且可预测的作业处理模型。
  • 具有无宏API的作业处理程序。
  • 充分利用tower生态系统中的中间件、服务和实用程序。
  • 运行时无关 - 使用tokio、smol等。
  • 可选Web界面,帮助您管理作业。

apalis作业处理由tower::Service提供支持,这意味着您可以访问tower中间件。

apalis支持

crate 示例
定时作业
Redis
Sqlite
Postgres
MySQL
Amqp
从头开始

入门指南

要开始,只需在Cargo.toml中添加

[dependencies]
apalis = { version = "0.6" }
apalis-redis = { version = "0.6" }
# apalis-sql = { version = "0.6", features = ["postgres"] } # or mysql, sqlite

用法

use apalis::prelude::*;
use apalis_redis::{RedisStorage, Config};
use serde::{Deserialize, Serialize};

#[derive(Debug, Deserialize, Serialize)]
struct Email {
    to: String,
}

/// A function that will be converted into a service.
async fn send_email(job: Email, data: Data<usize>) -> Result<(), Error> {
  /// execute job
  Ok(())
}

#[tokio::main]
async fn main() -> {
    std::env::set_var("RUST_LOG", "debug");
    env_logger::init();
    let redis_url = std::env::var("REDIS_URL").expect("Missing env variable REDIS_URL");
    let conn = apalis_redis::connect(redis_url).await.expect("Could not connect");
    let storage = RedisStorage::new(conn);
    Monitor::new()
        .register_with_count(2, {
            WorkerBuilder::new(format!("email-worker"))
                .data(0usize)
                .backend(storage)
                .build_fn(send_email)
        })
        .run()
        .await
}

然后

//This can be in another part of the program or another application eg a http server
async fn produce_route_jobs(storage: &RedisStorage<Email>) -> Result<()> {
    let mut storage = storage.clone();
    storage
        .push(Email {
            to: "[email protected]".to_string(),
        })
        .await?;
}

功能标志

  • tracing(默认启用)—— 支持跟踪👀
  • sentry—— 支持Sentry异常和性能监控
  • prometheus—— 支持Prometheus度量
  • retry—— 支持直接重试作业
  • timeout—— 支持作业超时
  • limit—— 💪 限制作业数量
  • filter—— 支持基于谓词过滤作业
  • catch-panic - 捕获执行过程中发生的panic

存储比较

由于我们提供了一些存储解决方案,以下是它们的比较表

功能 Redis Sqlite Postgres Sled Mysql Mongo Cron
计划作业 x x
重试作业 x x
持久化 x x BYO
重新运行已死亡作业 x x x

apalis的工作原理

以下是核心部分集成的基本示例

sequenceDiagram
    participant App
    participant Worker
    participant Backend

    App->>+Backend: Add job to queue
    Backend-->>+Worker: Job data
    Worker->>+Backend: Update job status to 'Running'
    Worker->>+App: Started job
    loop job execution
        Worker-->>-App: Report job progress
    end
    Worker->>+Backend: Update job status to 'completed'

外部示例

使用 apalis 的项目

  • Ryot:一个用于跟踪您生活各方面(媒体、健身等)的自托管平台。
  • Summarizer:播客摘要器
  • Universal Inbox:Universal Inbox 是一个解决方案,将所有通知和任务集中在一个地方,以创建一个独特的收件箱。

资源

Web 用户界面

如果您正在运行 apalis Board,您可以轻松管理您的任务。请在此处查看一个工作的 REST API 示例

感谢

  • tower - Tower 是一个模块化和可重用组件库,用于构建健壮的网络客户端和服务器。
  • redis-rs - Rust 的 Redis 库
  • sqlx - Rust SQL 工具包

路线图

v 0.5

  • 重构 crates 结构
  • 模拟工具
  • 支持 SurrealDB 和 Mongo
  • Postgres 无锁支持
  • 添加更多实用层
  • 在 job fn 结构中使用提取器
  • 完善文档
  • 改进并标准化 apalis Board
  • 基准测试

v 0.4

  • 从基于 actor 的处理转换为基于层的处理
  • 优雅关闭
  • 允许使用除 Tokio 之外的其他类型的执行器
  • 模拟/测试工作者
  • 改进监控
  • 通过层添加工作进度
  • 添加更多来源

v 0.3

  • 标准化 API(存储、工作者、数据、中间件、上下文)
  • 引入 SQL
  • 实现 Sentry 和追踪的层
  • 完善文档
  • 组织模块和功能
  • 基本的 Web API 接口
  • SQL 示例
  • sqlx 迁移

v 0.2

  • Redis 示例
  • Actix Web 示例

贡献

请阅读 CONTRIBUTING.md 了解我们的行为准则和向我们提交拉取请求的流程。

版本

我们使用 SemVer 进行版本控制。有关可用的版本,请参阅此存储库的 标签

作者

请参阅参与此项目的 贡献者列表

许可证

本项目采用 MIT 许可证 - 有关详细信息,请参阅 LICENSE.md 文件。

依赖

~35–48MB
~855K SLoC