35个版本
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日 |
#286 in 数据库接口
23,946 每月下载量
在 5 个crate中使用(通过 apalis)
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'
外部示例
- 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
- 重构 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 进行版本控制。有关可用版本,请参阅本存储库的标签。
作者
- Njuguna Mureithi - 初始工作 - Njuguna Mureithi
请参阅参与此项目的贡献者列表。
许可
本项目采用 MIT 许可证 - 有关详细信息,请参阅LICENSE.md 文件。
依赖项
~8–24MB
~330K SLoC