노드 Node.js
16. 마이크로서비스 아키텍처(MSA)와 RabbitMQ 활용
안녕하세요! 태마입니다.
Node.js 기초 강좌입니다.
강좌의 경우
1. 주제 간단 정리
2. 상세 주제 정리
으로 이루어져 있습니다.
노드 Node.js
포스팅 시작하겠습니다 :)
1. 주제 간단 정리
1. 마이크로서비스 아키텍처(MSA)란?
마이크로서비스 아키텍처(Microservices Architecture, MSA)는
애플리케이션을 독립적인 여러 개의 서비스(모듈)로 분리하여 운영하는 아키텍처입니다.
📌 마이크로서비스 아키텍처의 특징
✔ 서비스 단위 분리 → 독립적으로 개발 및 배포 가능
✔ 확장성 우수 → 특정 서비스만 확장 가능 (예: 결제 서비스만 확장)
✔ 각 서비스별 독립적인 데이터베이스 사용 가능
✔ 다양한 기술 스택 적용 가능 → 각 서비스별로 다른 프로그래밍 언어 사용 가능
✅ MSA와 모놀리식 아키텍처 비교
구분모놀리식 아키텍처마이크로서비스 아키텍처
구조 | 하나의 큰 애플리케이션 | 독립적인 여러 개의 서비스 |
확장성 | 전체 시스템을 확장해야 함 | 특정 서비스만 개별 확장 가능 |
유지보수 | 코드베이스가 커서 복잡함 | 서비스 단위로 유지보수 용이 |
배포 방식 | 전체 애플리케이션을 한 번에 배포 | 개별 서비스 단위로 배포 가능 |
📌 MSA를 사용하면 서비스별로 독립적인 개발 및 배포가 가능하여 유지보수가 용이!
✅ 여기까지 마이크로서비스 아키텍처의 개념과 특징을 배웠습니다!
👉 "그렇다면, MSA에서 서비스 간 통신을 어떻게 할까?"
✅ 2부에서 RabbitMQ를 활용한 서비스 간 메시지 큐(Message Queue) 시스템을 배워봅시다!
2. 상세 주제 정리
1. RabbitMQ란?
RabbitMQ는 메시지 브로커(Message Broker)로서 서비스 간 비동기 메시지 큐를 제공하는 도구입니다.
📌 RabbitMQ의 역할
✔ 비동기 메시지 처리 → 요청을 대기열(Queue)에 저장하고 순차적으로 처리
✔ 서비스 간 독립성 유지 → 서비스 간 직접적인 API 호출 없이 메시지 전달
✔ 트래픽 분산 → 특정 서비스가 부하가 높을 때 대기열을 활용하여 효율적으로 처리
✅ RabbitMQ 메시지 큐 개념
1️⃣ 서비스 A(Producer) → RabbitMQ(Queue)에 메시지 발행(Publish)
2️⃣ 서비스 B(Consumer) → RabbitMQ에서 메시지 수신(Consume) 후 처리
2. RabbitMQ 설치 및 패키지 설정
✅ 1) Docker를 사용하여 RabbitMQ 실행
$ docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
📌 RabbitMQ 관리 콘솔(http://localhost:15672)에서 메시지 큐 모니터링 가능!
✅ 2) Node.js에서 RabbitMQ 패키지 설치
$ npm install amqplib
📌 amqplib은 RabbitMQ와 연결하여 메시지를 송수신하는 라이브러리!
3. RabbitMQ를 활용한 메시지 송수신
✅ 1) 메시지 생산자(Producer) – 메시지 큐에 데이터 추가
const amqp = require("amqplib");
async function sendMessage() {
const connection = await amqp.connect("amqp://localhost");
const channel = await connection.createChannel();
const queue = "task_queue";
const message = "Hello, RabbitMQ!";
await channel.assertQueue(queue, { durable: true });
channel.sendToQueue(queue, Buffer.from(message));
console.log(`📨 메시지 전송: ${message}`);
setTimeout(() => {
connection.close();
}, 500);
}
sendMessage();
📌 메시지를 RabbitMQ의 task_queue에 추가!
✅ 2) 메시지 소비자(Consumer) – 메시지 큐에서 데이터 수신
const amqp = require("amqplib");
async function receiveMessage() {
const connection = await amqp.connect("amqp://localhost");
const channel = await connection.createChannel();
const queue = "task_queue";
await channel.assertQueue(queue, { durable: true });
console.log("📩 대기 중...");
channel.consume(queue, (msg) => {
console.log(`✅ 메시지 수신: ${msg.content.toString()}`);
channel.ack(msg);
});
}
receiveMessage();
📌 대기열에 있는 메시지를 수신하고 처리!
✅ 3) 실행 결과
📨 메시지 전송: Hello, RabbitMQ!
📩 대기 중...
✅ 메시지 수신: Hello, RabbitMQ!
📌 서비스 간 직접적인 API 호출 없이 메시지를 주고받을 수 있음!
4. RabbitMQ의 응용 – 서비스 간 비동기 통신 구현
✅ 1) 주문 서비스(Order Service)
✔ 주문이 생성되면 메시지를 RabbitMQ에 전송
app.post("/order", async (req, res) => {
const orderData = { orderId: Date.now(), item: req.body.item };
const connection = await amqp.connect("amqp://localhost");
const channel = await connection.createChannel();
await channel.assertQueue("order_queue", { durable: true });
channel.sendToQueue("order_queue", Buffer.from(JSON.stringify(orderData)));
res.json({ message: "주문이 처리되었습니다!", orderData });
setTimeout(() => connection.close(), 500);
});
📌 주문이 발생하면 메시지 큐에 저장하여 비동기적으로 처리!
✅ 2) 결제 서비스(Payment Service) – 주문을 처리하는 소비자(Consumer)
✔ RabbitMQ에서 주문 정보를 받아 결제 처리
async function processPayment() {
const connection = await amqp.connect("amqp://localhost");
const channel = await connection.createChannel();
await channel.assertQueue("order_queue", { durable: true });
console.log("💳 결제 처리 대기 중...");
channel.consume("order_queue", (msg) => {
const order = JSON.parse(msg.content.toString());
console.log(`✅ 결제 완료: 주문 ID ${order.orderId} | 상품: ${order.item}`);
channel.ack(msg);
});
}
processPayment();
📌 RabbitMQ에서 주문 정보를 받아 결제를 수행!
✅ 3) 실행 흐름
🛒 주문 요청 → RabbitMQ 저장 → 💳 결제 서비스에서 메시지 수신 후 처리
📌 RabbitMQ 덕분에 서비스 간 API 호출 없이 비동기 작업이 가능!
5. RabbitMQ 활용 시 고려할 점
✅ 1) 메시지 중복 처리 (Idempotency)
✔ 동일한 메시지가 여러 번 처리되지 않도록 중복 확인 로직 추가
✅ 2) 메시지 손실 방지 (Persistent Queue)
✔ durable: true 옵션을 사용하여 메시지가 서버 종료 후에도 유지되도록 설정
✅ 3) 여러 개의 Worker를 사용하여 성능 최적화
✔ 다수의 Consumer를 실행하여 대량의 요청을 병렬 처리 가능
channel.prefetch(5); // 한 번에 최대 5개의 메시지 처리
📌 RabbitMQ는 MSA에서 서비스 간 비동기 통신을 효율적으로 수행하는 강력한 도구!
✅ 여기까지 마이크로서비스 아키텍처(MSA)와 RabbitMQ 활용 방법을 배웠습니다!
👉 "그렇다면, MSA에서 API 게이트웨이(API Gateway)를 어떻게 구현할까?"
✅ 다음 회차에서 API Gateway와 서비스 관리 방법을 배워봅시다!
'IT Developer > Node.js' 카테고리의 다른 글
Node.js 기초 <20. 서버리스(Serverless) 환경에서 CI/CD 구축> (0) | 2025.03.22 |
---|---|
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 기초 <15. 작업 큐(Queue)와 백그라운드 작업 처리 (Bull 활용)> (1) | 2025.03.17 |
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 |