Programming

메시지 지향 미들웨어, 메시지 브로커, 메시지 큐

Jay-JI 2024. 8. 26. 17:34

메시지 지향 미들웨어(Message-Oriented Middleware – MOM)

 

MOM이란 응용 소프트웨어 간에 비동기적 데이터 통신을 위한 소프트웨어를 의미한다. 보다 쉽게 말하자면 MOM이란 독립된 서비스들이 서로 데이터를 주고받을 수 있도록 하는 미들웨어를 의미한다.

  • 미들웨어란 서로 다른 어플리케이션들을 연결하여 데이터 교환을 가능하게 해주는 소프트웨어이다.
  • 메세지 지향 시스템은 메세지 API를 통해 분산된 어플리케이션간의 중개 역할을 수행하여 데이터가 안전하고 신뢰성 있게 교환될 수 있도록 지원한다.
  • MOM은 메세지를 통해 여러 분산된 시스템간의 Connector 역할을 하며 시스템 간의 결합성을 낮추고 실시간으로 비동기식 데이터 교환을 가능하게 한다.

 

MOM 기반 시스템

 

 

주문, 결제, 배송, 재고 관리 등 다양한 시스템이 서로 연동되어야 하는 대규모 전자상거래 플랫폼이 있다고 가정하자. 분산되어 있는 각각의 시스템이 서로 데이터를 주고받을 때 MOM을 사용하지 않는다면 다음과 같은 방식으로 데이터를 주고받아야 한다.

  1. 시스템 A가 시스템 B로 직접 API 호출
  2. 시스템 A가 DB 테이블에 데이터 insert / 시스템 B가 DB 테이블에서 데이터 select
  3. 시스템 A가 서버 특정 위치에 파일 생성 / 시스템 B가 파일 내용 read

 

MOM은 이러한 문제를 쉽게 해결할 수 있다.

 

참고로 MOM은 반드시 특정한 방식으로 작동해야 한다는 고정된 규칙이 없다. 이는 시스템 간 메시지 교환을 위해 다양한 방식으로 구현될 수 있다는 걸 의미하는데 대표적인 구현 방식은 다음과 같다.

 

  1. 메시지 큐 (Message Queue)
    - 큐 자료구조를 이용해 메시지를 저장하고 순차적으로 전달하는 방식
    - 비동기적 메시징을 통해 시스템 간의 결합도를 낮추고 신뢰성 있는 통신을 지원

  2. 발행/구독 (Publish/Subscribe)
    - 발신자가 특정 주제(Topic)나 채널에 메시지를 게시하고, 해당 주제를 구독한 수신자들이 메시지를 받는 방식
    - 이 방식은 여러 수신자가 동시에 메시지를 받을 수 있게 만듦

  3. 데이터 스트리밍 (Data Streaming)
    - 지속적으로 생성되는 데이터를 실시간으로 처리하고 전달하는 방식
    - 주로 실시간 분석, 로그 처리, IoT 데이터를 처리할 때 사용됨

또한 이러한 구현 방식은 단독으로 사용되기 보다, 다른 구현 방식과 결합되어 사용되기도 한다.

 


메시지 브로커와 이벤트 브로커

 

MOM에서 메시지를 주고받는 방식은 대표적으로 메시지 브로커, 이벤트 브로커 방식이 있는데 이 2가지 방식의 특징은 다음과 같다.

 

 

[메시지 브로커]

  • 작동 방식
    - 주로 메시지 큐를 사용하여 메시지를 전송
    - 메시지는 큐에 저장되고, 수신자가 이를 꺼내 처리하는 방식

  • 주요 특징
    - 신뢰성 : 메시지가 순차적으로 전달되고 손실 없이 처리됨
    - 동기 처리 : 송신자와 수신자가 동시에 작업할 필요 없이 독립적으로 메시지를 처리할 수 있다.
    - 순서 보장 : 메시지는 순서대로 처리됨

  • 사용 사례
    - 시스템 간 데이터 전송, 트랜잭션 처리, 백그라운드 작업 처리

 

[이벤트 브로커]

  • 작동 방식
    - 발행/구독(Publish/Subscribe) 모델을 사용
    - 발행자가 이벤트를 생성하면 이를 구독한 모든 수신자가 실시간으로 이벤트를 받음

  • 주요 특징
    - 실시간 처리 : 이벤트가 생성되면 즉시 수신자에게 전달됨
    - 확장성 : 여러 수신자가 동시에 이벤트를 구독하고 처리할 수 있음
    - 다대다 통신 : 하나의 이벤트가 여러 수신자에게 전달될 수 있음

  • 사용 사례
    - 실시간 데이터 스트리밍, 로그 수집, 이벤트 기반 아키텍처, IoT 데이터 처리

 

메시지 브로커는 주로 메시지의 신뢰성 있는 전달과 순서 보장에 중점을 두며, 작업의 비동기적 처리를 지원하는 것이 주 목적이다. 반면 이벤트 브로커는 실시간 데이터 처리와 다수의 수신자가 동시에 데이터를 처리할 수 있는 능력에 중점을 둔다.

 

이러한 메시지 브로커와 이벤트 브로커는 개념적으로 구분되지만 실제 구현에서는 그 경계가 명확하지 않을 수 있다. 예를 들어 Kafka는 이벤트 브로커로 주로 사용되지만 메시지 큐의 역할도 할 수 있으며, RabbitMQ는 메시지 브로커로서 발행/구독 모델을 지원하여 이벤트 브로커로 활용될 수 있다. 따라서, 시스템의 요구사항에 따라 동일한 기술이 여러 방식으로 사용될 수 있으며 메시지와 이벤트를 처리하는 방식은 유연하게 조정될 수 있다.

 


메시지 큐(Message Queue)란

 

메시지 큐(Message Queue)는 Queue 자료구조를 사용하여 메시지를 전달하는 시스템이다. 메시지 큐는 주로 비동기적인 데이터 전달을 가능하게 하며, 프로세스 또는 프로그램 인스턴스가 서로 데이터를 교환할 때 사용된다. 이때 메세지를 발행하고 전달하는 부분을 Producer 라고 하며 메세지를 받아서 소비하는 부분을 Consumer 라고 한다.

 


 

메시지 큐의 장단점

 

[메시지 큐의 장점]

  1. 비동기 처리
    - 메시지 큐는 송신자와 수신자가 동시에 동작할 필요 없이 비동기적으로 통신할 수 있게 만듦
    - 어플리케이션이 메시지를 큐에 넣은 후, 즉시 다음 작업을 진행할 수 있도록 하여 시스템의 성능과 반응성을 향상시킴

  2. 확장성
    - 메시지 큐는 수신자가 여러 대일 경우, 큐에 쌓인 메시지를 분산하여 처리할 수 있다.
    - 즉 시스템이 확장될 수 있도록 지원하며, 높은 부하 상황에서도 성능을 유지할 수 있게 만듦

  3. 내구성 및 신뢰성
    - 많은 메시지 큐 시스템은 메시지를 영구적으로 저장할 수 있는 옵션을 제공하여 시스템 장애 시에도 메시지가 손실되지 않도록 할 수 있다.
    - 이러한 기능을 통해 어플리케이션 간의 데이터 전송의 신뢰성을 높일 수 있음

  4. 결합도 감소
    - 메시지 큐를 사용하면 어플리케이션 간의 결합도를 줄일 수 있다.
    - 송신자와 수신자는 서로를 알 필요 없이 메시지를 주고받을 수 있어 시스템의 유지보수를 용이하게 만듦

  5. 부하 분산
    - 메시지 큐는 작업을 여러 수신자에게 분산할 수 있어, 특정 수신자에 대한 부하를 줄이고 시스템의 성능을 최적화할 수 있음

  6. 장애 격리
    - 메시지 큐는 송신자와 수신자 사이에서 중개자 역할을 하기 때문에, 시스템의 일부가 중단되거나 성능 저하를 겪더라도 다른 부분에 영향을 미치지 않도록 격리할 수 있다.
    - 예를 들어 수신자가 일시적으로 중단되거나 처리 속도가 느려지더라도 송신자는 계속해서 메시지를 큐에 넣을 수 있다. 이로 인해 시스템의 다른 부분은 중단 없이 정상적으로 동작할 수 있다.
    - 그리고 시간이 지나 장애 상황이 해결된 수신자는 메시지 큐에 쌓여 있던 데이터를 순차적으로 처리하면 된다.

[메시지 큐의 단점]

  1. 복잡성 증가
    - 메시지 큐를 사용하면 메시지 큐 관리, 모니터링, 메시지 중복 처리, 오류 처리 등 추가적인 고려 사항이 생겨, 개발 및 운영 비용을 증가시킬 수 있다.

  2. 메시지 지연
    - 메시지 큐가 과부하 상태이거나 수신자가 느리게 처리하는 경우 메시지 처리에 지연이 발생할 수 있다.

  3. 단일 장애점(Single Point of Failure, SPOF)
    - 메시지 큐 서버는 시스템 간 통신을 중개하는 중요한 역할을 하기 때문에, 메시지 큐 서버가 중단되면 시스템 전반에 걸쳐 심각한 영향을 미칠 수 있다.

  4. 메시지 손실 가능성
    - 메시지 큐를 비영구(non-persistent) 모드로 설정한 경우, 메시지 큐 서버가 비정상적으로 종료되거나 재시작되면 메모리에만 저장된 메시지가 모두 사라질 수 있다.
    - 메시지 큐에 갑작스럽게 대량의 메시지가 쌓이거나 큐의 용량이 초과되면 새롭게 들어오는 메시지가 거부되거나 손실될 수 있다.

주요 메시지 브로커, 이벤트 브로커 구현체

 

1. ActiveMQ

  • Apache Software Foundation에서 개발한 오픈소스 메시지 브로커
  • JMS(Java Message Service) 표준을 지원하는 것이 특징
  • 다양한 프로토콜을 지원하며, 신뢰성과 성능이 뛰어난 메시지 전달을 제공
  • 특히, JMS 기반 애플리케이션에서 많이 사용됨
JMS(Java Message Service)
  - 자바 기반의 메시징 시스템을 위한 표준 인터페이스  
  - 메시지의 생성, 전송, 수신을 통일된 방식으로 관리할 수 있게 해줌  
  - JMS를 사용하면 다양한 자바 어플리케이션과 쉽게 연동할 수 있음

 

2. RabbitMQ

  • AMQP(Advanced Message Queuing Protocol)를 기반으로 하는 오픈소스 메시지 브로커
  • 경량화된 디자인으로, 높은 성능과 확장성을 제공하며, 다양한 언어로 작성된 클라이언트 라이브러리를 지원함
  • 주요 특징으로는 메시지의 라우팅 및 큐잉, 발행/구독 모델을 지원함
AMQP(Advanced Message Queuing Protocol)  
  - 메시지 지향 미들웨어를 위한 개방형 표준 프로토콜  
  - 주로 메시지 브로커 간의 메시지 전송을 표준화하는 데 사용됨  
  - AMQP는 플랫폼과 언어에 독립적이며, 메시지의 신뢰성, 라우팅, 보안 등을 보장함

 

 

3. Kafka

  • Apache Kafka는 분산 스트리밍 플랫폼
  • ActiveMQ, RabbitMQ와 달리 메시지 브로커가 아닌 이벤트 브로커
  • 메시지 큐와 유사한 역할을 하지만 실시간 데이터 스트리밍과 로그 수집, 분석에 강점이 있다.
  • 높은 처리량과 내구성을 자랑하며, 메시지를 클러스터에 분산 저장하여 대규모 시스템에서도 안정적으로 동작함
  • 대용량 데이터 처리에 적합함

출처 : 
https://velog.io/@choidongkuen/%EC%84%9C%EB%B2%84-%EB%A9%94%EC%84%B8%EC%A7%80-%ED%81%90Message-Queue-%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90
https://www.ibm.com/kr-ko/topics/message-queues
https://aws.amazon.com/ko/message-queue/
https://docs.oracle.com/cd/E19148-01/820-0532/6nc919fai/index.html
https://velog.io/@rlaghwns1995/MOM-Message-Oriented-Middleware-%EB%9E%80
https://f-lab.kr/insight/message-queue-system-comparison