33次发布
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日 |
34 在 异步 中排名
23,704 每月下载量
用于 5 个crate (3 个直接使用)
205KB
4.5K 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'
外部示例
- 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 文件。
依赖关系
~2–16MB
~211K SLoC