
백엔드
BullMQBullMQ
BullMQ는 Node.js와 Redis 기반의 고성능 분산 큐 시스템이다. Bull의 후속 버전으로 TypeScript를 완전 지원하며, 작업 우선순위, 스케줄링, 흐름(Flow) 등 고급 기능을 제공한다.
기본 사용법
typescript
import { Queue, Worker, QueueEvents } from 'bullmq';
import { Redis } from 'ioredis';
const connection = new Redis({ host: 'localhost', port: 6379 });
// 큐 생성
const emailQueue = new Queue('email', { connection });
// 작업 추가
await emailQueue.add('send-welcome', {
to: 'user@example.com',
template: 'welcome'
}, {
attempts: 3,
backoff: { type: 'exponential', delay: 5000 },
removeOnComplete: 100, // 완료 후 100개만 보존
removeOnFail: 200
});
// 지연 실행
await emailQueue.add('send-reminder', data, {
delay: 24 * 60 * 60 * 1000 // 24시간 후
});
// Worker (작업 처리)
const worker = new Worker('email', async (job) => {
const { to, template } = job.data;
await sendEmail(to, template);
return { sent: true };
}, { connection, concurrency: 5 });
worker.on('completed', (job, result) => {
console.log(`Job ${job.id} done:`, result);
});
worker.on('failed', (job, err) => {
console.error(`Job ${job?.id} failed:`, err.message);
});Flow (의존 관계가 있는 작업)
typescript
import { FlowProducer } from 'bullmq';
const flow = new FlowProducer({ connection });
// 트리 구조 작업 흐름
const job = await flow.add({
name: 'generate-report',
queueName: 'reports',
data: { reportId: 1 },
children: [
{
name: 'fetch-sales',
queueName: 'data',
data: { type: 'sales' }
},
{
name: 'fetch-inventory',
queueName: 'data',
data: { type: 'inventory' },
children: [
{
name: 'sync-warehouse',
queueName: 'sync',
data: { warehouseId: 42 }
}
]
}
]
});
// 자식 작업이 모두 완료되어야 부모 작업 실행대시보드 (Bull Board)
typescript
import { createBullBoard } from '@bull-board/api';
import { BullMQAdapter } from '@bull-board/api/bullMQAdapter';
import { ExpressAdapter } from '@bull-board/express';
const serverAdapter = new ExpressAdapter();
createBullBoard({
queues: [new BullMQAdapter(emailQueue)],
serverAdapter
});
app.use('/admin/queues', serverAdapter.getRouter());관련 문서
- •[[celery|Celery 심화]]
- •[[sidekiq|Sidekiq]]
- •[[redis-streams|Redis Streams]]