BullMQ alternatives for Node.js: an honest 2026 guide
BullMQ is the default Redis job queue for Node.js — but it isn't the only choice. Here's an even-handed map of the alternatives (Bee-Queue, pg-boss, Agenda, @imqueue/job and more), what each is actually good at, and how to pick.
BullMQ is the name most Node.js teams reach for when they need background jobs on Redis — it's mature, feature-rich, and by far the most downloaded option (~500K weekly). For a lot of projects it's the right answer, and this guide isn't here to talk you out of it.
But "most popular" and "best fit for your stack" aren't the same thing. Maybe you don't run Redis. Maybe you want a smaller surface than BullMQ's full job-lifecycle machinery. Maybe you already have a service framework and want the queue to be part of it. This is an even-handed map of the realistic alternatives in 2026, what each is genuinely good at, and how to choose.
Disclosure: I maintain
@imqueue, which includes a job queue (@imqueue/job). It's on this list, and I've tried hard to place it honestly — as one small, opinionated option among several, not the "winner." Where BullMQ or another tool is the better fit, I say so.
When you'd look for a BullMQ alternative
BullMQ is an excellent default. You'd reasonably shop around when:
- You don't want to run Redis. BullMQ requires it. If your system of record is Postgres or MongoDB, adding Redis just for jobs is real operational surface (another thing to provision, monitor, back up, and reason about during failures).
- You want a smaller footprint. BullMQ's feature surface — flows, rate limiting, repeatable/cron jobs, priorities — is a strength when you need it and weight when you don't.
- Licensing matters to you. BullMQ is MIT. Some alternatives (including
@imqueue) are copyleft or dual-licensed — that can be a plus or a minus depending on your project. - The queue should be part of a larger framework, sharing a client, serialization, and conventions with the rest of your services.
- You want a fully managed queue and are willing to trade library-level control for not operating infrastructure at all.
The landscape at a glance
| Option | Datastore | Best for | License |
|---|---|---|---|
| BullMQ | Redis | Feature-rich job processing: flows, rate limits, cron, priorities | MIT |
| Bee-Queue | Redis | Simple, high-throughput, short-lived jobs | MIT |
| pg-boss | PostgreSQL | Teams already on Postgres who want ACID guarantees, no Redis | MIT |
| Agenda | MongoDB | Cron-style recurring scheduling on an existing Mongo stack | MIT |
| @imqueue/job | Redis | Minimal, safe-by-default jobs inside a cohesive RPC framework | GPL‑3.0 / commercial |
| Cloud queues (SQS, Cloud Tasks) | Managed | Zero infra ops, cloud-native pipelines | Proprietary (usage-based) |
| Bull (v3) | Redis | Existing apps already on it | MIT |
(Feature and maintenance details reflect each project's documented behavior at the time of writing — always check the project's own repo for the current picture.)
The alternatives, one by one
Bee-Queue — the lightweight Redis option
Bee-Queue is a Redis-backed queue built deliberately around simplicity and speed, with a much smaller feature set than BullMQ. It shines for large volumes of short, near-real-time jobs where you don't need flows, cron, or a big lifecycle API. If BullMQ feels like more than you need and you're staying on Redis, Bee-Queue is the classic "just a fast queue" pick.
Trade-off: you give up the breadth — no flows, limited scheduling/lifecycle features — in exchange for a small, fast core.
pg-boss — a job queue inside Postgres
pg-boss is the standout if you're already on PostgreSQL and don't want to add Redis. It implements the queue using Postgres's SKIP LOCKED — a feature designed precisely for this — giving you safe concurrent job pickup with the ACID guarantees of your existing database. Jobs commit in the same transactional world as your data, and it's actively maintained.
Trade-off: Postgres-backed queues top out at lower throughput than a Redis queue under very heavy load, and you're leaning on your primary database for queue traffic. For most application workloads that's a fine bargain; for extreme fan-out it may not be.
pg-boss vs Graphile Worker. These two are the Postgres options, and they differ
in emphasis rather than capability. Graphile Worker
leans on Postgres harder — LISTEN/NOTIFY for latency in the low milliseconds,
jobs enqueued from SQL functions so you can schedule work inside a transaction you
were writing anyway. pg-boss gives you more of the surrounding job system:
archiving, a richer scheduling model, singleton keys, a maintained migration path.
Pick Graphile Worker when the queue should be an extension of your SQL, pg-boss
when you want a job library that happens to store rows in Postgres. Both use
SKIP LOCKED, and neither will match Redis throughput.
Agenda — MongoDB-based scheduling
Agenda uses MongoDB and is oriented toward cron-like recurring scheduling. If your stack already runs Mongo and your need is "run this job every night / every 5 minutes" more than "process a firehose of jobs," Agenda fits naturally without introducing a new datastore.
Trade-off: it's a scheduler first; it isn't aiming at the high-throughput, rich-lifecycle territory BullMQ occupies.
@imqueue/job — minimal and safe-by-default
@imqueue/job is the Redis-backed job queue inside the @imqueue framework. Its point of difference is being small and safe by default: guaranteed delivery is on out of the box, so a job a dying worker was holding is re-queued for another worker after a lock TTL — the lease covers the hand-off rather than your handler, making at-least-once the real guarantee — with delayed/scheduled jobs to millisecond granularity and programmable retry/backoff. It's TypeScript-first and has a single dependency.
It makes most sense when you already use @imqueue for service-to-service RPC (the job queue shares the same core, serialization and conventions), or when you specifically want a tiny queue where "don't lose jobs" is the default rather than something you configure.
Trade-off: it is not trying to match BullMQ's feature surface. If you need declarative retry policies with automatic dead-lettering, priorities, rate limiting, cron-style repeatable jobs, or flows/parent-child dependencies, BullMQ is the stronger tool and @imqueue/job doesn't compete there. It's also GPL‑3.0 (with a commercial license available) rather than MIT — worth understanding if you ship closed-source. There's a full, honest head-to-head in @imqueue/job vs BullMQ.
Cloud / managed queues — no infra to run
If you'd rather not operate a queue at all, managed services like AWS SQS or Google Cloud Tasks move the durability, scaling and availability problem to the provider. Great for cloud-native pipelines and teams that want to minimize ops.
Trade-off: you trade library-level control and local ergonomics for a network hop and vendor coupling, and you work within the provider's model (visibility timeouts, delivery semantics, quotas) rather than an in-process API.
Bull (v3) — the predecessor
Bull is BullMQ's older sibling. It isn't deprecated and still powers plenty of production systems, but BullMQ is the recommended path for new projects — it's the actively evolved successor with the modern API. If you're already on Bull and it works, there's no emergency; if you're starting fresh, start on BullMQ.
Skip: Kue is officially deprecated and unmaintained — don't reach for it in new projects. You'll still see it in old tutorials; use one of the options above instead.
What about Kafka, RabbitMQ or Redis pub/sub?
They come up constantly in this comparison, and none of them is a BullMQ alternative — they're a different layer. BullMQ is a job queue: a library that gives you a typed job record, retries with backoff, delayed and repeatable jobs, concurrency limits and a dashboard. Kafka, RabbitMQ, NATS and Redis pub/sub are message transports: they move bytes between processes and leave the job semantics to you.
- RabbitMQ gets closest. It has durable queues, acknowledgements, dead-letter exchanges and delayed delivery via a plugin, so you can build a job system on it — and teams that already run it often do. What you don't get is the job model itself: progress, attempts, backoff strategies and a UI are yours to write.
- Kafka is a partitioned, replayable log. It's excellent for event streams and a poor fit for jobs: there is no per-message acknowledgement, no selective retry, and no delayed delivery. Reaching for Kafka to run background work means reimplementing a scheduler on top of an offset.
- Redis pub/sub is fire-and-forget broadcast. A subscriber that isn't connected simply misses the message, so it cannot be the substrate for work that must happen. Redis streams and lists can be — which is exactly what BullMQ and Bee-Queue build on.
So the honest answer to "BullMQ or Kafka?" is that they rarely compete. If the question is how do I run background work in Node, stay in this list. If it's how do my services talk to each other, that's a different comparison — and RPC over a message queue is the option this site is about.
How to choose
A quick decision guide:
- Already on Redis, need the full feature set (flows, rate limiting, cron, priorities)? → BullMQ. It's the default for a reason.
- On Redis but want something small and fast for short jobs? → Bee-Queue.
- Primary datastore is Postgres and you'd rather not add Redis? → pg-boss.
- On MongoDB and mostly need recurring/cron scheduling? → Agenda.
- Want zero queue infrastructure to operate? → a cloud queue (SQS / Cloud Tasks).
- Already building services with
@imqueue, or you want a minimal queue where at-least-once delivery is the default? →@imqueue/job.
The honest summary: BullMQ remains the safe, capable default on Redis. The alternatives win when a specific constraint — your datastore, your appetite for features, your ops budget, or your framework — points elsewhere.
Frequently asked questions about BullMQ alternatives
Is BullMQ still the best Node.js job queue in 2026?
For a feature-rich, Redis-backed queue, BullMQ is still the most capable and most widely used option. "Best" depends on your constraints — if you don't run Redis or want a smaller surface, an alternative may fit better.
What's the best BullMQ alternative if I don't use Redis?
pg-boss (PostgreSQL) if you're on Postgres, or Agenda (MongoDB) if you're on Mongo. Both let you avoid introducing Redis just for jobs.
What's a lighter alternative to BullMQ on Redis?
Bee-Queue for a simple, fast queue, or @imqueue/job for a minimal, safe-by-default queue — especially if you already use @imqueue for RPC.
Is Bull deprecated?
No. Bull (v3) is still maintained enough to run in production, but BullMQ is its successor and the recommended choice for new projects. Kue, a different older library, is deprecated — avoid it.
Should I use a job queue or a workflow engine?
If you need durable, long-running orchestration with complex state, a workflow engine (e.g. Temporal) is a different category worth evaluating. For discrete background jobs, a queue like the ones above is simpler and lighter.
Want to try the minimal, safe-by-default option? Get started with @imqueue, read the @imqueue/job vs BullMQ deep-dive, or browse the API reference. Shipping inside a closed-source product? See commercial licensing & support.
Read this page as plain markdown — no HTML, no navigation. For pasting into an LLM, or for an agent to fetch.
Building on @imqueue? The open-source packages live on GitHub and the docs at imqueue.org. Shipping inside a closed-source product? See commercial licensing & support.