노드 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 활용법을 배워봅시다!
'IT Developer > Node.js' 카테고리의 다른 글
Node.js 기초 <19. CI/CD (Continuous Integration & Deployment) 구축> (0) | 2025.03.21 |
---|---|
Node.js 기초 <18. 중앙 집중형 로그 관리와 APM(Application Performance Monitoring)> (0) | 2025.03.20 |
Node.js 기초 <17. API 게이트웨이(API Gateway)와 서비스 관리> (0) | 2025.03.19 |
Node.js 기초 <16. 마이크로서비스 아키텍처(MSA)와 RabbitMQ 활용> (0) | 2025.03.18 |
Node.js 기초 <14. 클라우드 스토리지(AWS S3, Firebase)와 파일 업로드> (0) | 2025.03.16 |
Node.js 기초 <13. 파일 업로드와 이미지 처리 (multer 활용)> (0) | 2025.03.15 |
Node.js 기초 <12. Express의 미들웨어와 요청 처리 흐름> (0) | 2025.03.14 |
Node.js 기초 <11. 인증과 보안: JWT, OAuth, 세션 관리> (0) | 2025.03.13 |