The fastest, most reliable, Redis-based distributed queue for Node.
Carefully written for rock solid stability and atomicity.
Follow @manast for *important* Bull/BullMQ/BullMQ-Pro news and updates!
You can find tutorials and news in this blog: https://blog.taskforce.sh/
Do you need to work with BullMQ on platforms other than Node.js? If so, check out the BullMQ Proxy
Supercharge your queues with a professional front end:
- Get a complete overview of all your queues.
- Inspect jobs, search, retry, or promote delayed jobs.
- Metrics and statistics.
- and many more features.
Sign up at Taskforce.sh
Some notable organizations using BullMQ:
| Microsoft | Vendure | Datawrapper | Nest | Langfuse |
| Curri | Novu | NoCodeDB |
|
Install:
$ yarn add bullmq
Add jobs to the queue:
import { Queue } from 'bullmq'; const queue = new Queue('Paint'); queue.add('cars', { color: 'blue' });
Process the jobs in your workers:
import { Worker } from 'bullmq'; const worker = new Worker('Paint', async job => { if (job.name === 'cars') { await paintCar(job.data.color); } });
Listen to jobs for completion:
import { QueueEvents } from 'bullmq'; const queueEvents = new QueueEvents('Paint'); queueEvents.on('completed', ({ jobId }) => { console.log('done painting'); }); queueEvents.on( 'failed', ({ jobId, failedReason }: { jobId: string; failedReason: string }) => { console.error('error painting', failedReason); }, );
Adds jobs with parent-child relationship:
import { FlowProducer } from 'bullmq'; const flow = new FlowProducer(); const originalTree = await flow.add({ name: 'root-job', queueName: 'topQueueName', data: {}, children: [ { name: 'child-job', data: { idx: 0, foo: 'bar' }, queueName: 'childrenQueueName', children: [ { name: 'grandchild-job', data: { idx: 1, foo: 'bah' }, queueName: 'grandChildrenQueueName', }, { name: 'grandchild-job', data: { idx: 2, foo: 'baz' }, queueName: 'grandChildrenQueueName', }, ], }, { name: 'child-job', data: { idx: 3, foo: 'foo' }, queueName: 'childrenQueueName', }, ], });
This is just scratching the surface, check all the features and more in the official documentation
Since there are a few job queue solutions, here is a table comparing them:
| Feature | BullMQ-Pro | BullMQ | Bull | Kue | Bee | Agenda |
|---|---|---|---|---|---|---|
| Backend | redis | redis | redis | redis | redis | mongo |
| Observables | β | |||||
| Group Rate Limit | β | |||||
| Group Support | β | |||||
| Batches Support | β | |||||
| Parent/Child Dependencies | β | β | ||||
| Deduplication (Debouncing) | β | β | β | |||
| Deduplication (Throttling) | β | β | β | |||
| Priorities | β | β | β | β | β | |
| Concurrency | β | β | β | β | β | β |
| Delayed jobs | β | β | β | β | β | |
| Global events | β | β | β | β | ||
| Rate Limiter | β | β | β | |||
| Pause/Resume | β | β | β | β | ||
| Sandboxed worker | β | β | β | |||
| Repeatable jobs | β | β | β | β | ||
| Atomic ops | β | β | β | β | ||
| Persistence | β | β | β | β | β | β |
| UI | β | β | β | β | β | |
| Optimized for | Jobs / Messages | Jobs / Messages | Jobs / Messages | Jobs | Messages | Jobs |
Fork the repo, make some changes, submit a pull-request! Here is the contributing doc that has more details.
Thanks for all the contributors that made this library possible, also a special mention to Leon van Kammen that kindly donated his npm bullmq repo.