Retry backoff is configurable, which covered our flaky-webhook case.
Umbral Tasks
Official by Umbral contributorsdurable jobs, workers, retries, priorities, periodic beat
About
Some work shouldn't happen inside the request — sending the welcome email, resizing the upload, calling the flaky third-party webhook. Umbral Tasks is the Celery-equivalent: annotate an async function with #[task], enqueue it from a handler, and a separate worker drains the queue durably. The queue is a DB table, so a crash doesn't lose jobs, and retries back off exponentially instead of hammering a service that's already down.
Install
Wire it up
use *;
use TasksPlugin;
let app = builder
.database
.plugin
.build?;
Run the worker beside your web process:
Target: offload the welcome email
Define the job once, enqueue it from anywhere, and let the worker deliver it.
use ;
async
// From a signup handler:
register_send_welcome; // once at startup
enqueue.await?;
What you get
#[task]macro turns an async fn into an enqueueable job- DB-backed queue that survives a process crash
- Retries with exponential backoff + per-task timeouts
- Priority queues and future
eta/delayscheduling - Periodic "beat" tasks (cron or fixed interval)
- Read-only queue browser in the admin, with "Retry selected"
Usage
Register `TasksPlugin` in the app, annotate handlers with `#[umbral::task]`, and call `register_<fn>()` at startup so the worker knows them. Enqueue with `enqueue(...)` from any handler, then run `cargo run -- worker` (and `tasks-beat` for schedules) beside the web process.
cargo add umbral-tasks
Feature tracker
Per-feature shipping status, recorded in the directory.
Annotate a function as an enqueueable background job.
Jobs persisted to a table and drained by a worker.
cargo run -- worker consumes and executes jobs.
Failed jobs retry with exponential backoff.
Run a job at a future eta.
Higher-priority jobs are claimed before lower-priority work.
tasks-beat fires periodic jobs on interval schedules.
Stores task outcomes for inspection and retry decisions.
Admin-facing task rows for monitoring and manual retry.
Compatibility
Declared support per Umbral version and database backend.
No compatibility rows declared yet.
Community notes
1 note in the discussion thread.
Reported issues
Bugs and abuse reports filed against this plugin.
No open issues
No issues have been reported against this plugin. Track upstream bugs on the maintainer's tracker, or report a directory problem to the Umbral team.