#background-jobs #job-processing #background-processing #redis #apalis #message #queueing

apalis-redis

apalis的Redis存储:使用Redis进行后台任务和消息队列

35个版本

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日

#286 in 数据库接口

Download history 5425/week @ 2024-05-03 7462/week @ 2024-05-10 4998/week @ 2024-05-17 6495/week @ 2024-05-24 3847/week @ 2024-05-31 5453/week @ 2024-06-07 5299/week @ 2024-06-14 6477/week @ 2024-06-21 3617/week @ 2024-06-28 5199/week @ 2024-07-05 4166/week @ 2024-07-12 4574/week @ 2024-07-19 4646/week @ 2024-07-26 5341/week @ 2024-08-02 7532/week @ 2024-08-09 4859/week @ 2024-08-16

23,946 每月下载量
5 个crate中使用(通过 apalis

MIT 许可证

200KB
4K 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 - 捕获执行过程中发生的恐慌

存储比较

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

功能 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 UI

如果您正在运行 apalis Board,您可以轻松管理您的任务。请参阅这里的REST API 示例

感谢

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

路线图

v 0.5

  • 重构 crate 结构
  • 模拟工具
  • 支持 SurrealDB 和 Mongo
  • 为 Postgres 提供无锁支持
  • 添加更多工具层
  • 在作业 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 文件。

依赖项

~8–24MB
~330K SLoC