39 个版本
0.6.0-rc.5 | 2024 年 7 月 25 日 |
---|---|
0.6.0-alpha.0 | 2024 年 6 月 30 日 |
0.5.1 | 2024 年 3 月 13 日 |
0.4.7 | 2023 年 11 月 18 日 |
0.2.0 | 2021 年 5 月 14 日 |
在 并发 类别中排名 516
每月下载量 26,530
被 9 个 Crates 使用(其中 6 个直接使用)
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'
外部示例
- Shuttle:使用 apalis-cron 和 shuttle.rs
- Actix-Web:使用 apalis-redis 和 actix-web
使用 apalis 的项目
- Ryot:一个自托管的平台,用于跟踪您生活的各个方面——媒体、健身等。
- Summarizer:播客摘要器
- Universal Inbox:Universal Inbox 是一种解决方案,将您的所有通知和任务集中在一个地方,以创建一个独特的收件箱。
资源
Web UI
如果您正在运行 apalis Board,您可以轻松管理您的作业。在此处查看一个工作示例 rest API
感谢
路线图
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 进行版本控制。有关可用的版本,请参阅此存储库的 标签。
作者
- Njuguna Mureithi - 初始工作 - Njuguna Mureithi
有关参与此项目的 贡献者 列表,请参阅。
许可证
本项目采用 MIT 许可证——有关详细信息,请参阅 LICENSE.md 文件。
依赖项
~1.7–3MB
~58K SLoC