taskforcesh/bullmq

BullMQ - Message Queue and Batch processing for NodeJS, Python, .NET, Elixir, Rust and PHP based on Redis or PostgreSQL

TypeScript

9,499

3,862 commits

updated Oct 12, 2026

See the code

README




The fastest, most reliable, Redis-based distributed queue for Node.js, Python, Elixir, .NET, Rust, PHP, and more.
Carefully written for rock solid stability and atomicity.

Read the documentation

Follow Us for *important* Bull/BullMQ/BullMQ-Pro news and updates!

πŸ›  Tutorials

You can find tutorials and news in this blog: https://blog.taskforce.sh/

News πŸš€

🌐 Language agnostic BullMQ

BullMQ is available natively in multiple languages:

  • Node.js / Bun β€” This repository (npm install bullmq)
  • Python β€” python/ directory (pip install bullmq)
  • Rust β€” rust/ directory (cargo add bullmq-official --rename bullmq)
  • Elixir β€” elixir/ directory ({:bullmq, "~> x.x"})
  • .Net β€” dotnet/ directory (dotnet add package BullMQ)
  • PHP β€” php/ directory

For other platforms, check out the BullMQ Proxy.

Official FrontEnd

Taskforce.sh, Inc

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

πŸš€ Sponsors πŸš€

Dragonfly Dragonfly is a new Redisβ„’ drop-in replacement that is fully compatible with BullMQ and brings some important advantages over Redisβ„’ such as massive better performance by utilizing all CPU cores available and faster and more memory efficient data structures. Read more here on how to use it with BullMQ.

Used by

Some notable organizations using BullMQ:

The gist

Install:

$ yarn add bullmq

If you use the node-redis adapter (createNodeRedisClient), install redis v5 or newer (redis >= 5.0.0).

If you use the Valkey Glide adapter (createValkeyGlideClient), install @valkey/valkey-glide.

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

Feature Comparison

Since there are a few job queue solutions, here is a table comparing them:

FeatureBullMQ-ProBullMQBullKueBeeAgenda
Backendredisredisredisredisredismongo
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 forJobs / MessagesJobs / MessagesJobs / MessagesJobsMessagesJobs

Contributing

Fork the repo, make some changes, submit a pull-request! Here is the contributing doc that has more details.

Thanks

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.

background-jobs
elixir
nodejs
php
python
queue
redis
rust
typescript

Project health

Overall

6.8/10

Maintained

10/10

Code review

10/10
OpenSSF Scorecard

Latest release

6.3.12 Β· Oct 9, 2026

Releases this year

127

Significant stargazers

(top 24 of 102)

Kye Gomez

3,540 followers Β· starred Apr 2026

Jeswin

74 followers Β· starred Jul 2025

IsmaΓ«l MejΓ­a

207 followers Β· starred Jul 2026

Cancai Cai

139 followers Β· starred Aug 2026

taskforcesh/bullmq

BullMQ - Message Queue and Batch processing for NodeJS, Python, .NET, Elixir, Rust and PHP based on Redis or PostgreSQL

TypeScript

9,499

3,862 commits

updated Oct 12, 2026

See the code

README




The fastest, most reliable, Redis-based distributed queue for Node.js, Python, Elixir, .NET, Rust, PHP, and more.
Carefully written for rock solid stability and atomicity.

Read the documentation

Follow Us for *important* Bull/BullMQ/BullMQ-Pro news and updates!

πŸ›  Tutorials

You can find tutorials and news in this blog: https://blog.taskforce.sh/

News πŸš€

🌐 Language agnostic BullMQ

BullMQ is available natively in multiple languages:

  • Node.js / Bun β€” This repository (npm install bullmq)
  • Python β€” python/ directory (pip install bullmq)
  • Rust β€” rust/ directory (cargo add bullmq-official --rename bullmq)
  • Elixir β€” elixir/ directory ({:bullmq, "~> x.x"})
  • .Net β€” dotnet/ directory (dotnet add package BullMQ)
  • PHP β€” php/ directory

For other platforms, check out the BullMQ Proxy.

Official FrontEnd

Taskforce.sh, Inc

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

πŸš€ Sponsors πŸš€

Dragonfly Dragonfly is a new Redisβ„’ drop-in replacement that is fully compatible with BullMQ and brings some important advantages over Redisβ„’ such as massive better performance by utilizing all CPU cores available and faster and more memory efficient data structures. Read more here on how to use it with BullMQ.

Used by

Some notable organizations using BullMQ:

The gist

Install:

$ yarn add bullmq

If you use the node-redis adapter (createNodeRedisClient), install redis v5 or newer (redis >= 5.0.0).

If you use the Valkey Glide adapter (createValkeyGlideClient), install @valkey/valkey-glide.

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

Feature Comparison

Since there are a few job queue solutions, here is a table comparing them:

FeatureBullMQ-ProBullMQBullKueBeeAgenda
Backendredisredisredisredisredismongo
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 forJobs / MessagesJobs / MessagesJobs / MessagesJobsMessagesJobs

Contributing

Fork the repo, make some changes, submit a pull-request! Here is the contributing doc that has more details.

Thanks

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.

background-jobs
elixir
nodejs
php
python
queue
redis
rust
typescript

Project health

Overall

6.8/10

Maintained

10/10

Code review

10/10
OpenSSF Scorecard

Latest release

6.3.12 Β· Oct 9, 2026

Releases this year

127

Significant stargazers

(top 24 of 102)

Kye Gomez

3,540 followers Β· starred Apr 2026

Jeswin

74 followers Β· starred Jul 2025

IsmaΓ«l MejΓ­a

207 followers Β· starred Jul 2026

Cancai Cai

139 followers Β· starred Aug 2026