IT Developer/Node.js

Node.js 기초 <15. 작업 큐(Queue)와 백그라운드 작업 처리 (Bull 활용)>

TEMA_ 2025. 3. 17. 16:12
반응형

노드 Node.js

15. 작업 큐(Queue)와 백그라운드 작업 처리 (Bull 활용)

 

안녕하세요! 태마입니다.

Node.js 기초 강좌입니다.

 

강좌의 경우 

1. 주제 간단 정리

2. 상세 주제 정리

으로 이루어져 있습니다.

 

노드 Node.js

포스팅 시작하겠습니다 :)

 


 

1. 주제 간단 정리

 

 

1. 작업 큐(Queue)가 필요한 이유

일반적인 웹 애플리케이션에서는 **긴 시간이 걸리는 작업(이미지 처리, 이메일 전송, 데이터 분석 등)**을
즉시 실행하면 서버의 응답 속도가 느려질 수 있습니다.

이 문제를 해결하기 위해 작업 큐(Queue)를 사용하여 비동기적으로 백그라운드 작업을 실행할 수 있습니다.

📌 작업 큐를 사용하면?
서버 응답 속도 향상 → 사용자는 빠르게 응답을 받고, 작업은 백그라운드에서 처리
서버 부하 감소 → 대량의 요청을 분산하여 처리 가능
장기 실행 작업 지원 → 대규모 데이터 처리, 파일 변환, 자동화 작업 등에 활용 가능


 

2. Bull과 Redis를 활용한 작업 큐

Bull이란?
Node.js에서 사용할 수 있는 강력한 작업 큐 라이브러리
Redis 기반으로 빠르고 안정적인 작업 관리 가능
작업 재시도(Retry), 일정 예약(Scheduling), 작업 우선순위(Priority) 설정 가능

작업 큐 사용 예시

  • 회원 가입 후 이메일 인증 메일 전송
  • 이미지 변환, 압축, 썸네일 생성
  • 대량 데이터 처리(예: 로그 분석, 레포트 생성)

✅ 여기까지 작업 큐의 개념과 활용 이유를 배웠습니다!
👉 "그렇다면, Bull을 활용하여 작업 큐를 어떻게 구현할까?"
2부에서 Bull과 Redis를 활용한 백그라운드 작업 처리 방법을 배워봅시다!

반응형

 

2. 상세 주제 정리

 

1. Redis 설정 및 Bull 설치

1) Redis 설치 및 실행 (Docker 사용 가능)

$ docker run --name redis -p 6379:6379 -d redis

📌 Redis는 Bull 작업 큐를 저장하고 관리하는 데 사용됨!

2) Bull 패키지 설치

$ npm install bull

📌 Bull은 Redis 기반으로 동작하는 작업 큐 라이브러리!


 

2. 기본적인 작업 큐 구현 (이메일 전송 예제)

1) 작업 큐 생성 및 작업 추가

const Queue = require("bull");

const emailQueue = new Queue("emailQueue", {
  redis: { host: "localhost", port: 6379 }
});

// 작업 추가 (이메일 전송)
emailQueue.add({ email: "user@example.com", subject: "Welcome!", body: "Hello, welcome to our service!" });

console.log("이메일 전송 작업이 큐에 추가됨!");

📌 작업이 큐에 추가되면 백그라운드에서 실행됨!

2) 작업 실행 및 처리 (Worker 설정)

emailQueue.process(async (job) => {
  console.log(`이메일 전송 중: ${job.data.email}`);
  await new Promise((resolve) => setTimeout(resolve, 3000)); // 가짜 대기 시간
  console.log("이메일 전송 완료!");
});

📌 작업이 실행되면, 해당 작업을 백그라운드에서 처리 가능!

3) 작업 실행 후 로그 출력 예시

이메일 전송 중: user@example.com
(3초 후)
이메일 전송 완료!

📌 사용자는 즉시 응답을 받고, 이메일은 백그라운드에서 전송됨!


 

3. 작업 재시도 및 우선순위 설정

1) 실패한 작업 자동 재시도 설정

emailQueue.add(
  { email: "user@example.com" },
  { attempts: 3, backoff: 5000 } // 최대 3번 재시도, 5초 간격
);

📌 이메일 전송 실패 시 최대 3번까지 재시도!

2) 작업 우선순위 설정

emailQueue.add({ email: "vip@example.com" }, { priority: 1 }); // 높은 우선순위
emailQueue.add({ email: "user@example.com" }, { priority: 10 }); // 낮은 우선순위

📌 우선순위(priority)가 낮을수록 먼저 실행됨!


 

4. 예약 작업(Scheduling) – 특정 시간에 실행

1) 특정 시간 이후 작업 실행 (Delayed Job)

emailQueue.add(
  { email: "delayed@example.com" },
  { delay: 60000 } // 60초 후 실행
);

📌 1분 후 자동으로 실행됨!

2) 정기 작업 실행 (Cron Job 사용)

emailQueue.add({}, { repeat: { cron: "0 9 * * *" } }); // 매일 아침 9시에 실행

📌 매일 아침 9시에 자동 실행되는 작업 큐 생성 가능!


 

5. Bull Dashboard로 작업 모니터링

1) bull-board 설치

npm install bull-board

2) 작업 큐 상태를 웹 대시보드로 확인

const { BullAdapter } = require("bull-board/bullAdapter");
const { createBullBoard } = require("bull-board");

const { router, setQueues } = createBullBoard([new BullAdapter(emailQueue)]);

app.use("/admin/queues", router);

📌 http://localhost:3000/admin/queues에서 작업 상태를 시각적으로 확인 가능!


 

6. 대규모 트래픽에서 Bull을 최적화하는 방법

1) 여러 개의 Worker를 실행하여 성능 향상

emailQueue.process(5, async (job) => {
  console.log(`이메일 전송 중: ${job.data.email}`);
});

📌 한 번에 5개의 작업을 동시에 처리하도록 설정 가능!

2) Redis Cluster 활용
Redis Cluster를 사용하여 분산 작업 처리 가능
복수의 Redis 인스턴스를 사용하면 대량의 작업을 효율적으로 처리 가능

3) 이벤트 기반 처리 (이벤트 리스너 추가)

emailQueue.on("completed", (job) => {
  console.log(`작업 완료: ${job.id}`);
});
emailQueue.on("failed", (job, err) => {
  console.log(`작업 실패: ${job.id}, 오류: ${err.message}`);
});

📌 작업 완료 및 실패 이벤트를 실시간으로 감지 가능!


✅ 여기까지 Bull을 활용한 작업 큐와 백그라운드 작업 처리 방법을 배웠습니다!
👉 "그렇다면, Node.js에서 마이크로서비스 아키텍처(MSA)를 어떻게 구현할까?"
다음 회차에서 마이크로서비스 아키텍처(MSA)와 RabbitMQ 활용법을 배워봅시다!

반응형