"I need a job queue" is an increasingly common request. Two serious options in Node.js: Inngest (serverless-first, SaaS) and BullMQ (self-hosted Redis). Let's compare.
BullMQ
Node.js library + Redis. Pros:
- Self-hosted; Redis cost is essentially the only cost (€5-15/mo on Hetzner).
- Full control: priority, rate limiting, concurrent processing, scheduled jobs.
- Mature, stable, millions of monthly downloads.
Cons: needs an always-on Redis (no pure serverless), workers and crash recovery on you, observability you build.
Inngest
SaaS that runs step-based functions via webhook. Pros:
- Zero infra: you write a function, it runs.
- Automatic step recovery: if step 3 of 5 fails, resumes at 3.
- Great debug dashboard.
- Native cron, fan-out, sleeps inside functions.
Cons: moderate vendor lock-in, cost grows with volume (free up to 50k steps/mo, then starter ~$50/mo).
When which
| Case | Pick |
|---|---|
| Below 1k jobs/day, serverless app | Inngest (free tier fits) |
| 1k-100k jobs/day, stable backend | BullMQ + Redis |
| Above 100k jobs/day | BullMQ with cluster, no serverless |
| Long jobs (hours) with complex steps | Inngest |
| Short, high-throughput jobs | BullMQ |
Operational lesson
For most Italian projects we ship (Node backend + Hetzner + Postgres), BullMQ wins for predictable cost and control. For edge-native SaaS where serverless infra is already chosen, Inngest is the natural complement. No outright winner.