34次发布
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日 |
#224 in 异步
9,775 每月下载量
用于 5 个crate(通过 apalis)
270KB
6K 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 用户界面
如果您正在运行 apalis Board,您可以轻松管理您的任务。请在此处查看一个工作的 REST API 示例
感谢
路线图
v 0.5
- 重构 crates 结构
- 模拟工具
- 支持 SurrealDB 和 Mongo
- Postgres 无锁支持
- 添加更多实用层
- 在 job 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 文件。
依赖
~35–48MB
~855K SLoC