Expand description
apalis
Simple and extensible multithreaded background task and messages processing library for Rust
Β§Features
- Simple, predictable task handling - Task handlers are just async functions, with a macro-free API
- Robust task execution - Built-in retries, rate limiting, timeouts, idempotency, and error handling
- Multiple storage backends - Redis, PostgreSQL, SQLite, and in-memory storage
- Advanced task management - Prioritization, scheduling, metadata, and result tracking
- Scalable by design - Distributed backends with configurable concurrency and multi-threaded execution
- Lightweight and lazy - Like a
Future, workers do nothing until polled or woken: no busy-waiting - Familiar dependency injection - Similar to popular frameworks like
actixandaxum - Runtime agnostic - Works with tokio, async-std, and other async runtimes
- Production ready - Built-in monitoring, metrics, graceful shutdown, and comprehensive error reporting
- Extensible middleware - Take full advantage of the
towerecosystem of services and utilities - Optional web interface - Manage and monitor tasks through a web UI
Β§Crate ecosystem
Β§Message queues
| Crate | Examples | Features |
|---|---|---|
apalis-amqp | π π π π‘ π· | |
apalis-nats | π π π π‘ π· | |
apalis-rsmq | π π π π‘ π· |
Β§Persistence backends
| Crate | Examples | Features |
|---|---|---|
apalis-redis | π π π π‘ π· β―οΈ | |
apalis-sqlite | π π π π‘ π· β―οΈ | |
apalis-postgres | π π π π‘ π· β―οΈ | |
apalis-mysql | π π π π‘ π· β―οΈ | |
apalis-pgmq | π π π π‘ π· β―οΈ |
Β§Scheduling
| Crate | Examples | Features |
|---|---|---|
apalis-cron | π π |
Β§Core & tooling
| Crate | Examples | Features |
|---|---|---|
apalis | π π π π‘ π· | |
apalis-core | : | π π |
apalis-workflow | π π π | |
apalis-board | π π π π‘ π· | |
apalis-board-api | π π π π‘ π· |
Β§Feature legend
- π Retries: automatically retry failed tasks.
- π Scheduling: delayed or scheduled execution.
- π Unique jobs: deduplication or idempotency.
- β―οΈ Resumable jobs: resume interrupted jobs or workflows.
- π Task leases: time-limited task ownership, visibility timeouts, or orphan recovery.
- π‘ Pubsub / realtime: event-driven notifications or realtime updates.
- π· Worker management: worker discovery, monitoring, lifecycle, or management APIs.
Β§Getting Started
To get started, just add to Cargo.toml
[dependencies]
apalis = { version = "1.0.0" }
# apalis-redis = { version = "1.0.0" } # Use redis/sqlite/postgres etcΒ§Usage
use apalis::prelude::*;
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize, Clone)]
struct Email {
to: String,
}
/// A function called for every task
async fn send_email(task: Email, data: Data<usize>) {
// execute task
}
#[tokio::main]
async fn main() {
let mut storage = MemoryStorage::new();
storage
.push(Email {
to: "test@example.com".to_string(),
})
.await
.expect("Could not add tasks");
WorkerBuilder::new("email-worker")
.backend(storage)
.concurrency(2)
.parallelize(tokio::spawn)
.data(0usize)
.build(send_email)
.run()
.await;
}Β§Workflows
apalishas first class support for sequential, dag and conditional workflows.
use apalis::prelude::*;
use apalis_workflow::*;
use std::time::Duration;
use apalis_file_storage::JsonStorage;;
#[tokio::main]
async fn main() {
let workflow = SteppedFlow::new("odd-numbers-workflow")
.delay_for(Duration::from_millis(1000))
.and_then(|a: usize| async move { Ok::<_, BoxDynError>((0..a).collect::<Vec<_>>()) })
.filter_map(|x| async move { if x % 2 != 0 { Some(x) } else { None } })
.and_then(|a: Vec<usize>| async move {
println!("Sum: {}", a.iter().sum::<usize>());
Ok::<_, BoxDynError>(())
});
let mut in_memory = JsonStorage::new_temp().unwrap();
in_memory.push_start(10).await.unwrap();
let worker = WorkerBuilder::new("rango-tango")
.backend(in_memory)
.on_event(|ctx, ev| {
println!("On Event = {:?}", ev);
})
.build(workflow);
worker.run().await.unwrap();
}For more functionality like fold, filter_map and other combinators checkout the docs
Β§How apalis works
Here is a basic example of how the core parts integrate
sequenceDiagram
participant App
participant Worker
participant Backend
App->>+Backend: Add task to queue
Backend-->>+Worker: Job data
Worker->>+Backend: Update task status to 'Running'
Worker->>+App: Started task
loop task execution
Worker-->>-App: Report task progress
end
Worker->>+Backend: Update task status to 'completed'Β§Observability
With the web UI, you can manage your jobs through a simple interface. Check out this working example to see how it works.

Β§Integrations
- zino: Next-generation framework for composable applications in Rust.
- spring-rs: Application framework written in Rust, inspired by Javaβs SpringBoot
Β§Projects using apalis
- Ryot: A self hosted platform for tracking various facets of your life - media, fitness etc.
- Hyprnote: Local-first AI Notepad for Private Meetings
- oxy: A framework for building SQL agents and automations for analytics.
- OpenZeppelin Relayer: OpenZeppelin relayer service
- Summarizer: Podcast summarizer
- Universal Inbox: Universal Inbox is a solution that centralizes all your notifications and tasks in one place to create a unique inbox.
- Hatsu: Self-hosted and fully-automated ActivityPub bridge for static sites.
- Stamon: A lightweight self-hosted status monitoring tool
- Gq: open-source filtering tool for JSON and YAML files
Β§External examples
- Shuttle: Using apalis-cron with shuttle.rs
- Actix-Web: Using apalis-redis with actix-web
- Zino-Example: Using zino
Β§Resources
- Background job processing with rust using actix and redis
- Feasibility of implementing cronjob with Rust programming language
- How to schedule and run cron jobs in Rust using apalis
Β§Thanks to
tower- Tower is a library of modular and reusable components for building robust networking clients and servers.redis-rs- Redis library for rustsqlx- The Rust SQL Toolkitcron- A cron expression parser and schedule explorer
Β§Contributing
Please read CONTRIBUTING.md for details on our code of conduct, and the process for submitting pull requests to us.
Β§Versioning
We use SemVer for versioning. For the versions available, see the tags on this repository.
Β§Contributors
See also the list of contributors who participated in this project.
Β§License
This project is licensed under the MIT License - see the LICENSE.md file for details
Β§Feature flags
tracing(enabled by default) β Support Tracing πsentryβ Support for Sentry exception and performance monitoringprometheusβ Support Prometheus metricsopentelemetryβ Support OpenTelemetry metricsretry(enabled by default) β Support direct retrying taskstimeout(enabled by default) β Support timeouts on taskslimit(enabled by default) β πͺ Limit the amount of tasksfilterβ Support filtering tasks based on a predicatecatch-panic(enabled by default) β Captures panics in executions and convert them to errorsconfig(enabled by default) β Allow running workers using configurationtask-contextβ Enables tracking of taskssharedβ Enables cloning backends that dont implement clonefullβ All available features