선 조치 후 분석

MQ(Message Queue) 개념 그리고 Kafka, RabbitMQ 차 본문

ETC/IT Knowledge

MQ(Message Queue) 개념 그리고 Kafka, RabbitMQ 차

JB1104 2024. 12. 6. 17:19
728x90
반응형
SMALL

프로젝트 진행에 있어서 Kafka를 이용하기로 했다. 그래서 처음 접하게 되어서 관련 필요 내용들을 정리해 보았다.


MQ(Message Queue)

메시지 지향 미들웨어(Message Oriented Middleware) 즉, MOM은 독립된 서비스 간에 데이터를
주고받을 수 있는 형태의 미들웨어를 의미한다. 메시지를 통해 여러 분산되어 있는 시스템 간의

Connector 역할을 통해 결합성을 낮추고, 실시간으로 비동기식 데이터를 교환할 수 있도록 하는 소프트웨어


그렇다면, MQ란?

MOM을 구현한 솔루션으로 비동기 메시지를 사용하는 서비스들 간에 데이터를 교환해 주는 역할을 한다
Producer, Consumer가 존재하고 Producer는 메시지를 큐(Queue)에 전송하고 Consumer가 큐(Queue)의 메시지를 처리

MQ를 사용하면 비동기로 요청을 처리하고 큐에 저장하여 Consumer에게 병목을 줄여 줄 수 있다.

 

 


Producer : 정보를 제공하는 자
Consumer : 정보를 제공받아 사용하는 자
Queue : Producer의 데이터를 임시 저장 및 Consumer가 사용할 수 있도록 데이터를 제공하는 곳

(Queue에서 데이터를 보내주는 게 아니라, Consumer가 데이터를 가져가는 것)

 

순서

1. Producer에서 정보(메시지)를 전송
2. Queue에 추가
3. Consumer가 Queue에서 데이터 호출

 

주요 특징

1) 비동기성 : Producer와 Consumer가 동시에 작동하지 않아도 메시지를 교환가능
2) 낮은 결합도 : Producer와 Consumer가 서로 의존하지 않고 독립적으로 동작
3) 부하 분산(탄력성) : 여러 Consumer 간 작업을 분산
4) 확장성 : 시스템 확장이 용이
5) 보장성 : 메시지를 Queue에 저장하여 Consumer가 처리할 준비가 될 때까지 보관


활용사례

1) 주문처리시스템
2) 이메일/SMS 알림 전송
3) 데이터 파이프라인


대표적인 MQ 도구

1) RabbitMQ
2) ActiveMQ
3) Amazone SQS


RabbitMQ

RabbitMQ는 '메시지 브로커 방식'

메시지 브로커란

서비스 및 시스템이 정보를 통신하고 교환할 수 있도록 하는 소프트웨어 모듈
메시지 브로커는 지정된 수신인에게 메시지를 확인, 라우팅, 저장 및 배달한다.

브로커는 다른 응용 프로그램 간의 중개자로 작동하여 보낸 사람이 소비자의 위치, 활성여부, 또는 그중 몇 개가 있는지도 모르게 메시지를 보낼 수 있다.

메시지 브로커 : Producer와 Consumer 간의 중개자 역할을 하는 시스템

 

 

RabbitMQ 특징

1. 큐(Queue) 중심

  • 메시지를 큐에 저장하고, 수신자는 메시지를 가져간다.
  • 메시지가 처리되면 큐에서 삭제되므로 1대 1로 전달하는 것이 기본


2. 다양한 메시징 패턴 지원

  • Direct Exchange : 특정 큐로 메시지를 전송
  • Fanout Exchange : 여러 큐에 메시지를 브로드캐스트.
  • Topic Exchange : 라우팅 키를 사용해 특정 큐에 메시지 전달
  • Header Exchange : 메시지 헤더 조건에 따라 전달


3. 주요 특징

  • 메시지는 한번 소비되면 삭제
  • 메시지 전달 실패 시 재시도 또는 DQL(Dead Letter Queue)로 이동
  • 발신자-수신자 간 느슨한 결합을 제공하면서도, 처리 결과 보장

 

4. 사용 사례

  • 작업 큐 : 비동기 작업 처리
  • 요청-응답 패턴 : 상태 동기화, 알림 처리
  • 간단한 이벤트 분배 : 상태 업데이트나 이벤트 전달

Kafka

Kafka는 'pub/sub 방식'

pub/sub란,

Producer가 메시지를 특정 주제(Topic)에 발행하고, Consumer가 해당 주제를 구독(Subscribe)하여 메시지를 가져가는 방식

 

Kafka 특징

1. 토픽(Topic) 중심

  • 메시지가 토픽에 저장되고, 수신자는 토픽을 읽는다
  • 토픽은 여러 파티션(Partition)으로 나뉘어 병렬처리 가능


2. 컨슈머 그룹

  • 여러 컨슈머 그룹이 동일한 토픽을 독립적으로 구독 가능
  • 각 컨슈머 그룹은 해당 메시지를 개별적으로 처리


3. 주요 특징

  • 메시지가 로그 형태로 저장되어 삭제되지 않고 유지(설정 가능)
  • 컨슈머는 메시지를 원하는 시점으로 재처리 가능(Offset 기반)
  • 메시지 순서를 파티션 단위로 보장

 

4. 사용사례

  • 실시간 로그 및 이벤트 스트리밍
  • 데이터 파이프라인 구축
  • 이벤트 기반 MSA

 

차이점

Kafka는 MQ의 특성을 가지고 있지만, 단순히 메시지를 전송하는 것 이상으로
'분산 데이터 스트리밍 및 처리'에 
중점을 둔 도구라고 볼 수 있다.


Queue vs Topic
Queue과 Topic 같은 개념이 아니다.

Topic과 Queue는 메시지를 전달하는 '기본 구조'라는 점에서 비슷하지만, 작동 방식과 사용 목적에 차이가 있다.

 

Queue

1대 1 메시지 전달

    • 메시지가 큐에 들어오면, 하나의 Consumer만 해당 메시지를 가져가 처리한다.
    • 메시지를 소비하면 큐에서 삭제
    • 순서 보장 : FIFO

Topic

1대 다 메시지 전달

  • Topic은 Producer가 데이터를 게시(publish)하고, Consumer가 이를 구독(Subscribe)한다.
  • 한 Topic에 여러 Consumer 그룹이 구독할 수 있으며각 Consumer 그룹은 독립적으로 메시지를 처리
  • 메시지는 삭제되지 않고, 저장(Log 형태) 되어, 나중에 재처리 가능
  • 순서보장 : 파티션(Partition) 단위에서 메시지 순서를 보장

그렇다면 이번 프로젝트에서는 왜 RabbitMQ대신에 Kafka를 선택하였나?

대규모 데이터 처리를 필요로 하는 MSA구조라 선택


RabbitMQ는 메시지를 큐에서 소비하면 즉시 삭제하는 방식으로 동작하기에, 메시지의 내구성과 장기보관이
중요한 대규모 데이터 처리에 적합하지 않다. 비록, 메시지 영속성이 활성화되어 있더라도, RabbitMQ는 
대규모 메시지의 저장 및 내구성 보장에 상대적으로 효율적이지 않다.

추가적으로, RabbitMQ는 상대적으로 낮은 처리량을 처리하는데 적합하다. 초당 처리되는 메시지 수에서
Kafka와 비교하여 성능이 뒤떨어진다. 그리고 RabbitMQ는 메시지를 소비하는 Consumer가 많을 때, 
각 Consumer가 메시지를 가져가는 방식에서 병목이 발생할 수 있다.


Kafka는 토픽을 여러 파티션으로 분할하여 데이터를 저장한다. 각 파티션은 독립적으로 병렬 처리가 가능하고 이 덕분에 처리량이 높아지고 대량의 데이터를 효율적으로 처리할 수 있다.

728x90
반응형
LIST