41 lines
1.4 KiB
TypeScript
41 lines
1.4 KiB
TypeScript
|
|
import { Queue, type ConnectionOptions } from 'bullmq';
|
||
|
|
|
||
|
|
const redisUrl = process.env.REDIS_URL!;
|
||
|
|
|
||
|
|
// 10 queues matching 11-REALTIME-AND-BACKGROUND-JOBS.md Section 3.1
|
||
|
|
const QUEUE_CONFIGS = {
|
||
|
|
email: { concurrency: 5, maxAttempts: 5 },
|
||
|
|
documents: { concurrency: 3, maxAttempts: 5 },
|
||
|
|
notifications: { concurrency: 10, maxAttempts: 3 },
|
||
|
|
import: { concurrency: 1, maxAttempts: 1 },
|
||
|
|
export: { concurrency: 2, maxAttempts: 3 },
|
||
|
|
reports: { concurrency: 1, maxAttempts: 3 },
|
||
|
|
webhooks: { concurrency: 5, maxAttempts: 3 },
|
||
|
|
maintenance: { concurrency: 1, maxAttempts: 3 },
|
||
|
|
ai: { concurrency: 2, maxAttempts: 3 },
|
||
|
|
bulk: { concurrency: 2, maxAttempts: 3 },
|
||
|
|
} as const;
|
||
|
|
|
||
|
|
export type QueueName = keyof typeof QUEUE_CONFIGS;
|
||
|
|
|
||
|
|
const queues = new Map<QueueName, Queue>();
|
||
|
|
|
||
|
|
export function getQueue(name: QueueName): Queue {
|
||
|
|
let queue = queues.get(name);
|
||
|
|
if (!queue) {
|
||
|
|
queue = new Queue(name, {
|
||
|
|
connection: { url: redisUrl } as ConnectionOptions,
|
||
|
|
defaultJobOptions: {
|
||
|
|
attempts: QUEUE_CONFIGS[name].maxAttempts,
|
||
|
|
backoff: { type: 'exponential', delay: 1000 },
|
||
|
|
removeOnComplete: { age: 24 * 3600 }, // keep completed jobs 24 hours
|
||
|
|
removeOnFail: { age: 7 * 24 * 3600 }, // keep failed jobs 7 days
|
||
|
|
},
|
||
|
|
});
|
||
|
|
queues.set(name, queue);
|
||
|
|
}
|
||
|
|
return queue;
|
||
|
|
}
|
||
|
|
|
||
|
|
export { QUEUE_CONFIGS };
|