[ 2024.11.04 TIL ] bull

박지영·2024년 11월 4일
0

Today I Learned

목록 보기
74/88
post-thumbnail

bull

bull이란?

Node.js 환경에서 주로 사용되는 작업 큐 라이브러리

  • 백그라운드 작업 처리, 작업 스케줄링, 재시도 로직 등을 효율적으로 관리

  • Redis를 기반으로 하여 작업을 큐에 넣고 작업 상태를 모니터링하며, 병렬 처리나 순차 처리 등 다양한 작업 시나리오를 지원

bull 주요 특징

작업 지연 및 스케줄링

  • 지정된 시간 이후에 실행되도록 작업을 지연시킬 수 있으며, 특정 시간에 작업을 예약할 수 있다.

작업 재시도

  • 실패한 작업에 대해 자동 재시도를 설정할 수 있어 안정성이 높다.

작업 우선순위

  • 각 작업에 우선순위를 지정하여 더 중요한 작업이 먼저 실행되도록 할 수 있다.

동시성 제어

  • 여러 작업을 병렬로 실행하여 처리 성능을 높일 수 있다.

이벤트 기반

  • bull queue는 다양한 이벤트(예: 작업 완료, 실패 등)를 제공하여 실시간 모니터링 및 로깅이 가능하다.

자체 모니터링

  • 작업의 진행 상황과 상태를 파악할 수 있는 기능을 제공한다.

bull 사용 예제

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 활용 사례

  • 이메일 전송

  • 이미지 및 비디오 처리

  • 데이터 크롤링 및 처리

  • 알림 시스템

  • 백그라운드 데이터 동기화

bullMQ

bullMQ란?

Bull의 후속 프로젝트로, 더 발전된 기능과 최신 기술을 포함한 작업 큐 라이브러리

  • Node.js 환경에서 강력하고 확장 가능한 백그라운드 작업 및 메시지 큐를 구현할 수 있도록 설계되었으며, Redis를 기반으로 작동한다.

  • BullMQ는 특히 대규모 시스템의 안정성, 성능 및 확장성을 염두에 두고 개발되었다.

bullMQ 주요 특징

Redis Streams 기반

  • BullMQ는 작업 큐의 데이터 저장과 이벤트 스트리밍을 위해 Redis Streams 기능을 사용

  • Redis Streams는 로그 구조화 저장방식을 사용하므로 데이터 삽입과 검색 속도가 빠르다.

  • 작업의 기록을 남겨 상태 추적 및 복구가 쉽다.

  • 여러 워커(worker)가 하나의 큐를 효율적으로 처리할 수 있도록 지원

고급 작업 스케줄링 및 반복

  • 정해진 시간에 작업을 실행하거나 반복 작업을 수행할 수 있는 스케줄링 기능을 제공

작업 우선순위 및 동시성 제어

  • 각 작업에 우선순위를 부여

  • 워커의 동시성 수준을 설정하여 병렬로 처리할 작업의 수를 제한할 수 있다.

완벽한 이벤트 기반 시스템

  • 이벤트 기반 아키텍처는 실시간으로 작업 처리 상태를 파악하고 그에 대응하는 로직을 구현할 수 있도록 해준다.

  • 지원하는 이벤트:

    • completed: 작업이 성공적으로 완료되었을 때 발생

    • failed: 작업이 실패했을 때 발생

    • progress: 작업의 진행 상태가 업데이트될 때 발생

    • stalled: 작업이 중단되었을 때 발생

  • 이벤트 활용:

    • 작업 모니터링 및 알림 시스템 구축

    • 대시보드나 로그를 통해 작업 상태 시각화

    • 작업 실패 시 알림을 보내거나 재시도 로직 실행

다중 큐 지원

  • 하나의 애플리케이션에서 여러 큐를 생성하고 관리할 수 있다.

  • 각 큐는 고유의 설정과 작업 유형을 가질 수 있어 복잡한 워크플로우를 분리하여 처리할 수 있다.

백오프 및 재시도 전략

  • 작업 실패 시 BullMQ는 자동으로 재시도를 설정할 수 있으며, 다양한 백오프 전략을 제공한다.

  • maxAttempts 속성을 사용하여 작업의 최대 재시도 횟수를 설정

  • 지수 백오프(Exponential Backoff): 재시도 간의 시간 간격이 지수적으로 증가하도록 설정

  • 네트워크 문제나 외부 서비스 장애 같은 일시적인 문제에 대해 자동으로 대응

작업 이벤트 TTL

  • 작업 이벤트의 TTL(Time-To-Live)을 설정하여 Redis에서 저장된 이벤트 데이터를 자동으로 제거할 수 있다.

  • 오래된 작업 이벤트가 Redis에 무한정 저장되지 않도록 방지

  • 사용자는 TTL 값을 설정하여 특정 기간 이후 이벤트 데이터가 삭제되도록 조정 가능

bullMQ 사용 예제

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}`);
});

bullMQ 활용 사례

  • 비동기 데이터 처리: 이미지 및 비디오 변환, 데이터 변환 작업 등을 백그라운드에서 실행할 수 있다.

  • 알림 및 이메일 전송: 대량의 알림 전송과 이메일 처리 작업을 효율적으로 관리할 수 있다.

  • 스케줄된 작업: 특정 시간대에 작업을 실행하거나 주기적으로 실행되도록 설정할 수 있다.

  • 데이터 파이프라인: ETL(추출, 변환, 로드) 파이프라인 구축에 사용된다.

profile
신입 개발자

0개의 댓글