For robust, durable background jobs (beyond FastAPI's lightweight BackgroundTasks), you use a real task queue: Celery (the established standard) or ARQ (a modern async-native queue). These run heavy, retryable, scheduled work in separate worker processes, backed by a broker like Redis.
Why not just BackgroundTasks?
BackgroundTasks runs in the web process → NO persistence (lost on crash), NO retries,
NO scheduling, and heavy work ties up the worker. Fine only for quick fire-and-forget.
For durable/critical/heavy/scheduled jobs → use a real task queue (Celery / ARQ).
