IT Developer/Node.js

Node.js 기초 <16. 마이크로서비스 아키텍처(MSA)와 RabbitMQ 활용>

TEMA_ 2025. 3. 18. 16:33
반응형

노드 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와 서비스 관리 방법을 배워봅시다!

반응형