What is BullMQ
BullMQ is a fast and robust distributed job and message queue. It is available natively for TypeScript/JavaScript (Node.js and Bun), Python, Elixir, Rust, .NET and PHP, and it can run on top of Redis™ (or compatible datastores such as Valkey and Dragonfly) as well as on PostgreSQL.
BullMQ helps you solve many of the problems found in modern architectures, from offloading heavy work out of your web servers to orchestrating complex workflows across micro-services written in different languages.
The library is designed so that it will fulfill the following goals:
- At-least-once delivery: every job is delivered to a worker at least once. Under normal operation each job is processed exactly once, but if a worker crashes or loses the lock of a job while processing it, the job can be processed again, so design your processors to be idempotent.
- Easy to scale horizontally: add more workers, on as many machines as you need, to process jobs in parallel.
- Consistent: every state transition of a job is atomic, implemented as Lua scripts on Redis and as transactional SQL functions on PostgreSQL.
- High performance: get the highest possible throughput from your datastore by combining efficient scripts, pipelining and a polling-free design.
- Language and datastore agnostic: every SDK shares the exact same scripts and data model, so producers and workers written in different languages can work on the same queues.
View the repository, see open issues, and contribute back on GitHub!
Supported languages
All the SDKs are developed in the same repository and are built on top of the same Lua and SQL scripts, which guarantees identical behavior across languages. A job added from a PHP web application can be processed by a Python worker, and its result consumed by a Node.js service.
| Language | Package | Install | Redis™ | PostgreSQL |
|---|---|---|---|---|
| TypeScript (Node.js and Bun) | bullmq | npm install bullmq | ✅ | ✅ |
| Python | bullmq | pip install bullmq | ✅ | ✅ |
| Elixir | bullmq | {:bullmq, "~> 2.3"} | ✅ | ✅ |
| .NET | BullMQ | dotnet add package BullMQ | ✅ | ✅ |
| Rust | bullmq-official | cargo add bullmq-official --rename bullmq | ✅ | ❌ |
| PHP | taskforcesh/bullmq-php | Composer | ✅ | ❌ |
The TypeScript package is the reference implementation and the one covered by the Guide, so it is usually the first to receive new features. The other SDKs implement the core classes (Queue, Worker, QueueEvents, FlowProducer and job schedulers), with the exception of PHP, which provides a producer-only Queue client. Check the introduction page of each language for the details.
INFO
If your platform does not have a native SDK, you can still use BullMQ through the BullMQ Proxy, which exposes queues over HTTP.
Supported datastores
BullMQ is not tied to a specific datastore. The high-level classes talk to a backend that implements every queue operation, so you can choose the datastore that best fits your infrastructure:
- Redis™ 6.2 or newer (the default). BullMQ also works with compatible servers such as Valkey and Dragonfly, managed services such as AWS ElastiCache and AWS MemoryDB, and Redis Cluster. In Node.js you can use ioredis (default), node-redis, Bun's built-in Redis client or Valkey GLIDE. Read more in Connections.
- PostgreSQL 13 or newer. Run the very same API on PostgreSQL, so your jobs can live in the same database as the rest of your data, without operating a separate Redis instance. Read more in PostgreSQL backend.
You can also implement your own backend, see Providing a custom backend.
Features
If you are new to Message Queues, you may wonder why they are needed after all. Queues can solve many different problems in an elegant way, from smoothing out processing peaks to creating robust communication channels between micro-services or offloading heavy work from one server to many smaller workers, and many other use cases. Check the Patterns section for getting some inspiration and information about best practices.
Ecosystem
- BullMQ Pro: the commercial version of BullMQ, with advanced features such as groups, batches and observables, and dedicated support from the authors.
- Taskforce.sh: the official dashboard to monitor and manage your queues and jobs.
- NestJS: official integration with the NestJS framework.
Used by
BullMQ is used by many organizations big and small, here are some notable examples:


