#后台处理 #后台任务 #作业处理 #运行时 #tower #tower-middleware #生态系统

apalis-core

apalis 核心库:为 Rust 提供简单、可扩展的多线程后台处理

39 个版本

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 日

并发 类别中排名 516

Download history 7421/week @ 2024-04-28 6548/week @ 2024-05-05 7526/week @ 2024-05-12 4852/week @ 2024-05-19 7243/week @ 2024-05-26 4559/week @ 2024-06-02 5569/week @ 2024-06-09 6361/week @ 2024-06-16 7140/week @ 2024-06-23 4438/week @ 2024-06-30 6054/week @ 2024-07-07 4260/week @ 2024-07-14 6484/week @ 2024-07-21 5533/week @ 2024-07-28 7129/week @ 2024-08-04 7284/week @ 2024-08-11

每月下载量 26,530
9 Crates 使用(其中 6 个直接使用)

MIT 许可证

140KB
3K SLoC

apalis

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


功能

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

apalis 任务处理由 tower::Service 支持,这意味着您可以使用 tower 中间件。

apalis 支持

源代码 示例
计划任务
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

  • 重构 crates 结构
  • 模拟实用工具
  • 支持 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 文件。

依赖项

~1.7–3MB
~58K SLoC