Overview
A Queue is the fundamental building block in Bull. It connects to Redis and manages the lifecycle of jobs from creation to completion. Each queue instance maintains six internal data structures in Redis to organize jobs by their state.
Queue Constructor
The Queue constructor creates a new queue instance that persists in Redis:
Queue ( queueName : string , url ?: string , opts ?: QueueOptions ): Queue
Basic Usage
const Queue = require ( 'bull' );
const videoQueue = new Queue ( 'video transcoding' , 'redis://127.0.0.1:6379' );
const audioQueue = new Queue ( 'audio transcoding' , {
redis: { port: 6379 , host: '127.0.0.1' , password: 'foobared' }
});
const imageQueue = new Queue ( 'image transcoding' ); // Uses defaults
Redis Connection
Connection String
You can specify a Redis connection using a URL:
Connection Object
Alternatively, pass Redis options as an object:
const queue = new Queue ( 'myqueue' , {
redis: {
port: 6379 ,
host: '127.0.0.1' ,
db: 0 ,
password: 'your-password'
}
});
Default Connection
From the source code (~/workspace/source/lib/queue.js:129-136):
_ . defaults ( opts . redis , {
port: 6379 ,
host: '127.0.0.1' ,
db: opts . redis . db || opts . redis . DB ,
retryStrategy : function ( times ) {
return Math . min ( Math . exp ( times ), 20000 );
}
});
If not specified, Bull connects to Redis at 127.0.0.1:6379.
Multiple Queues
Queues are lightweight and cheap to create. You can create multiple queues for different job types:
const emailQueue = new Queue ( 'emails' );
const videoQueue = new Queue ( 'videos' );
const imageQueue = new Queue ( 'images' );
Each queue instance creates new Redis connections. For better resource usage, consider reusing connections with the createClient option.
Queue Options
The full queue options interface from the source:
interface QueueOptions {
createClient ?: ( type : 'client' | 'subscriber' | 'bclient' , config ?: RedisOpts ) => Redis ;
limiter ?: RateLimiter ;
redis ?: RedisOpts ;
prefix ?: string ; // Default: 'bull'
metrics ?: MetricsOpts ;
defaultJobOptions ?: JobOpts ;
settings ?: AdvancedSettings ;
}
Key Options
Prefix for all queue keys in Redis
Rate limiting configuration for job processing interface RateLimiter {
max : number ; // Number of jobs
duration : number ; // per duration milliseconds
groupKey ?: string ; // Group jobs by data key
}
Default options applied to all jobs added to this queue
Advanced queue settings for fine-tuning behavior
Internal Data Structures
From the source code (~/workspace/source/lib/queue.js:27-42), Bull maintains six Redis data structures:
/**
The Queue keeps 6 data structures:
- wait (list)
- active (list)
- delayed (zset)
- priority (zset)
- completed (zset)
- failed (zset)
--> priorities -- > completed
/ | /
job -> wait -> active
\ ^ \
v | -- > failed
delayed
*/
wait : Jobs waiting to be processed (FIFO list)
active : Jobs currently being processed (list)
delayed : Jobs scheduled for future processing (sorted set by timestamp)
priority : Jobs with priority values (sorted set)
completed : Successfully finished jobs (sorted set)
failed : Jobs that failed after all retry attempts (sorted set)
Advanced Settings
interface AdvancedSettings {
lockDuration : number ; // Default: 30000ms
lockRenewTime : number ; // Default: lockDuration / 2
stalledInterval : number ; // Default: 30000ms
maxStalledCount : number ; // Default: 1
guardInterval : number ; // Default: 5000ms
retryProcessDelay : number ; // Default: 5000ms
drainDelay : number ; // Default: 5ms
backoffStrategies : {}; // Custom backoff strategies
isSharedChildPool : boolean ; // Default: false
}
Example with Advanced Settings
const queue = new Queue ( 'myqueue' , {
settings: {
lockDuration: 60000 , // Extend lock to 60 seconds
stalledInterval: 60000 , // Check for stalled jobs every 60 seconds
maxStalledCount: 2 // Retry stalled jobs up to 2 times
}
});
Do not override advanced settings unless you understand the internals of the queue. Incorrect settings can lead to jobs being processed multiple times or becoming permanently stuck.
Rate Limiting
Limit the number of jobs processed in a time window:
const queue = new Queue ( 'api-calls' , {
limiter: {
max: 100 , // Maximum 100 jobs
duration: 5000 // per 5 seconds
}
});
Next Steps
Jobs Learn how to create and manage jobs
Processors Define functions to process queue jobs