Node.js 환경에서 주로 사용되는 작업 큐 라이브러리
백그라운드 작업 처리, 작업 스케줄링, 재시도 로직 등을 효율적으로 관리
Redis
를 기반으로 하여 작업을 큐에 넣고 작업 상태를 모니터링하며, 병렬 처리나 순차 처리 등 다양한 작업 시나리오를 지원
bull queue
는 다양한 이벤트(예: 작업 완료, 실패 등)를 제공하여 실시간 모니터링 및 로깅이 가능하다.const Queue = require('bull');
// 큐 생성
const myQueue = new Queue('my-queue');
// 작업 추가
myQueue.add({ jobData: 'example' });
// 작업 처리
myQueue.process(async (job) => {
console.log('Processing job:', job.data);
// 작업 로직
});
// 작업 완료 시 이벤트
myQueue.on('completed', (job, result) => {
console.log(`Job completed with result: ${result}`);
});
// 작업 실패 시 이벤트
myQueue.on('failed', (job, err) => {
console.error(`Job failed with error: ${err.message}`);
});
이메일 전송
이미지 및 비디오 처리
데이터 크롤링 및 처리
알림 시스템
백그라운드 데이터 동기화
Bull
의 후속 프로젝트로, 더 발전된 기능과 최신 기술을 포함한 작업 큐 라이브러리
Node.js 환경에서 강력하고 확장 가능한 백그라운드 작업 및 메시지 큐를 구현할 수 있도록 설계되었으며, Redis
를 기반으로 작동한다.
BullMQ
는 특히 대규모 시스템의 안정성, 성능 및 확장성을 염두에 두고 개발되었다.
BullMQ
는 작업 큐의 데이터 저장과 이벤트 스트리밍을 위해 Redis Streams 기능을 사용
Redis Streams는 로그 구조화 저장방식을 사용하므로 데이터 삽입과 검색 속도가 빠르다.
작업의 기록을 남겨 상태 추적 및 복구가 쉽다.
여러 워커(worker)가 하나의 큐를 효율적으로 처리할 수 있도록 지원
각 작업에 우선순위를 부여
워커의 동시성 수준을 설정하여 병렬로 처리할 작업의 수를 제한할 수 있다.
이벤트 기반 아키텍처는 실시간으로 작업 처리 상태를 파악하고 그에 대응하는 로직을 구현할 수 있도록 해준다.
지원하는 이벤트:
completed: 작업이 성공적으로 완료되었을 때 발생
failed: 작업이 실패했을 때 발생
progress: 작업의 진행 상태가 업데이트될 때 발생
stalled: 작업이 중단되었을 때 발생
이벤트 활용:
작업 모니터링 및 알림 시스템 구축
대시보드나 로그를 통해 작업 상태 시각화
작업 실패 시 알림을 보내거나 재시도 로직 실행
하나의 애플리케이션에서 여러 큐를 생성하고 관리할 수 있다.
각 큐는 고유의 설정과 작업 유형을 가질 수 있어 복잡한 워크플로우를 분리하여 처리할 수 있다.
작업 실패 시 BullMQ는 자동으로 재시도를 설정할 수 있으며, 다양한 백오프 전략을 제공한다.
maxAttempts
속성을 사용하여 작업의 최대 재시도 횟수를 설정
지수 백오프(Exponential Backoff)
: 재시도 간의 시간 간격이 지수적으로 증가하도록 설정
네트워크 문제나 외부 서비스 장애 같은 일시적인 문제에 대해 자동으로 대응
작업 이벤트의 TTL(Time-To-Live)을 설정하여 Redis에서 저장된 이벤트 데이터를 자동으로 제거할 수 있다.
오래된 작업 이벤트가 Redis에 무한정 저장되지 않도록 방지
사용자는 TTL 값을 설정하여 특정 기간 이후 이벤트 데이터가 삭제되도록 조정 가능
const { Queue, Worker, QueueScheduler } = require('bullmq');
// 큐 생성
const myQueue = new Queue('my-queue', {
connection: {
host: 'localhost',
port: 6379,
},
});
// 작업 추가
myQueue.add('myJob', { jobData: 'example' });
// 큐 스케줄러 생성 (작업 대기열의 상태를 안정적으로 유지)
const scheduler = new QueueScheduler('my-queue', {
connection: {
host: 'localhost',
port: 6379,
},
});
// 작업 처리
const worker = new Worker('my-queue', async (job) => {
console.log('Processing job:', job.data);
// 작업 로직
return 'Job completed';
}, {
connection: {
host: 'localhost',
port: 6379,
},
});
// 작업 완료 이벤트
worker.on('completed', (job) => {
console.log(`Job with ID ${job.id} completed`);
});
// 작업 실패 이벤트
worker.on('failed', (job, err) => {
console.error(`Job with ID ${job.id} failed: ${err.message}`);
});
비동기 데이터 처리: 이미지 및 비디오 변환, 데이터 변환 작업 등을 백그라운드에서 실행할 수 있다.
알림 및 이메일 전송: 대량의 알림 전송과 이메일 처리 작업을 효율적으로 관리할 수 있다.
스케줄된 작업: 특정 시간대에 작업을 실행하거나 주기적으로 실행되도록 설정할 수 있다.
데이터 파이프라인: ETL(추출, 변환, 로드) 파이프라인 구축에 사용된다.