메시지 지향 미들웨어 (MOM)
메시지 지향 미들웨어: 응용 소프트웨어 간의 비동기적 데이터 통신을 위한 소프트웨어
- 비동기적(Asynchronous) 한 방식을 이용해서 프로세스간의 데이터를 주고 받는 기능을 위한 시스템
- 메시지를 전달하는 과정에서 보관하거나 라우팅 및 변환할 수 있다는 장점을 가짐
- 메시지의 백업 기능을 유지함으로 써 지속성을 제공하며 이 덕분에 송수신 측은 동시에 네트워크 연결을 유지할 필요가 없음 (보관)
- 미들웨어 계층 자신이 직접 메시지 라우팅을 수행하기 때문에, 하나의 메시지를 여러 수신자에게 배포가 가능함 (라우팅)
- 송수신 측의 요구에 따라 전달하는 메시지를 변환할 수 있음 (변환)
메시지 큐 (Message Queue)
큐
- Queue 란 선입선출(First in First out) 구조를 가진 자료구조
- Queue 는 2개의 끝을 가지며 각각은 입구와 출구
- 새로운 데이터는 입구로 들어오고 나가는 데이터는 출구에서 나감
메시지 큐
- Queue 자료구조를 채택해서 메시지를 전달하는 시스템이며, 메시지 지향 미들웨어(MOM) 을 구현한 시스템임
- 메시지를 발행하고 전달하는 부분을 Producer 라고 하며, 메시지를 받아서 소비하는 부분을 Consumer 라고 함
- 메시지 큐는 Producer 와 Consumer 의 메시지 전달 역할을 하는 매개체
메시지 브로커 VS 이벤트 브로커
메시지 큐가 메시지 혹은 이벤트가 송신되고 수신되는 하나의 통신 통로라고 하면
브로커는 메시지 큐에 메시지 혹은 이벤트를 넣어주고 중개하는 역할을 하는 주체
-
메시지 브로커(Message Broker)
메시지 브로커는 Producer 가 생산한 메시지를 메시지 큐에 저장하고, 저장된 메시지를 Consumer가 가져갈 수 있도록 함
메시지 브로커는 Consumer 가 메시지 큐에서 데이터를 가져가게 되면 짧은 시간 내에 메시지 큐에서 삭제되는 특징이 있음
ex) RabbitMQ, ActiveMQ, AWS SQS, Redis
-
이벤트 브로커(Event Broker)
이벤트 브로커 또한 기본적으로 메시지 브로커의 역할을 할 수 있습니다.
하지만 반대로 메시지 브로커는 이벤트 브로커의 기능을 하지 못 함
이벤트 브로커가 관리하는 데이터를 이벤트라고 하며 Consumer 가 메시지 큐에서 데이터를 가져가게 되면 짧은 시간 내에 메시지가 삭제되는 것과 달리, 이벤트 브로커 방식에서는 Consumer 가 소비한 데이터를 필요한 경우 다시 소비할 수 있음
또한 메시지 브로커 보다 대용향 데이터를 처리할 수 있는 능력이 있음
ex) Kafka
메시지 큐의 장점
-
비동기(Asynchronous): Queue에 넣어두기 때문에 나중에 처리할 수 있음
-
낮은 결합도(Decoupling): 애플리케이션과 분리할 수 있음
-
탄력성(Resilience): 일부가 실패 시 전체에 영향을 받지 않음
-
과잉(Redundancy): 실패 할 경우 재실행이 가능함
-
신뢰성(Guarantees): 작업이 처리된 걸 확인할 수 있음
-
확장성(Scalable): 다수의 프로세스들이 큐에 메시지를 보낼 수 있음
1. 비동기 (Asynchronous)
- 메시지를 발행하는 Producer 역할을 하는 애플리케이션은 자신의 메시지를 전달 받는 Consumer 역할을 하는 애플리케이션에게 직접적으로 메시지를 보내야 함
- End-To-End 통신을 통해 메시지 전달이 이루어짐
- 해당 과정이 완료되기 전까지는 다른 메시지 전달 과정을 이루어지지 못 함
- 동기(Synchronous) 라고 하며 전송 속도가 빠르고 전송 결과를 신속하게 알 수 있는 장점이 있는 반면에, 대용량 트래픽이 발생하는 서버에서 이러한 방식은 매우 비효율적임

- 메시지큐를 중간에 배치한다면 Producer 는 메시지를 Consumer 에게 바로 보내지 않고 Queue 에 메시지를 넣어 관리함
- Consumer 는 비동기적으로 메시지를 처리할 수 있음
2. 낮은 결합도(Decoupling)
- 메시지큐를 통해 하나의 서비스를 구성하는 애플리케이션끼리의 결합도를 낮출 수 있음
- 결합도가 높을 때 얻을 수 있는 장점도 있지만 확장성, 유연성, 효율적인 유지 보수, 장애 전파 방지 등에 결합도가 낮을 때 얻을 수 있는 장점도 많음

3. 탄력성(Resilience)
- 탄력성(Resilience) 이란 시스템이 예기치 않은 상황 또는 장애에 대응하고 유연하게 대처할 수 있는 능력을 의미함
- 낮은 결합도(Decoupling) 을 통해 실현될 수 있음
- Producer 프로세스는 Consumer 프로세스가 다운되어 있어도 메시지를 정상적으로 발행할 수 있고, Consumer 는 구독한 메시지를 발행하는 Producer 프로세스가 다운되어 있어도 정상적으로 수신할 수 있음
4. 과잉(Redundancy)
- 과잉(Redundancy) 이란 정상적인 메시지 송/수신이 실패하는 경우 재실행이 가능함
- 메시지 큐가 없다면 시스템 응답성 저하,데이터 불일치 ,메시지 유실 등 다양한 문제가 발생할 수 있음
- 작업을 메시지로 메시지 큐에 넣어두면 일정 장애 기간동안 송신된 메시지는 큐에 남아있어 추후 장애 복구 시 정상적으로 재시도 및 복구가 가능함
5. 신뢰성(Guarantees)
- 신뢰성(Guarantees) 이란 송신된 메시지의 안전하고 확실한 전달을 의미함
- 메시지 큐라는 시스템 덕분에 장애가 발생하더라도 송신되는 메시지를 안전하고 확실하게 Consumer 가 수신할 수 있음
6. 확장성(Scalable)
- 확장성(Scalable) 중 수평확장성에 용이함
- 기존 메시지 큐를 이용한 통신에서 부하가 증가하거나 클라이언트의 동시다발적인 요청이 증가할 때, 메시지 큐에 Producer 와 Consumer 을 추가함으로 비교적 간단하고 쉽게 확장을 할 수 있음
메시지 큐의 종류
1. RabbitMQ
AMQP: 메시지 지향 미들웨어(MOM) 을 위한 개방형 표준 응용 계층 프로토콜

AMQP는 일반적인 메시지 큐와 비슷하지만 Exchange 라는 라우터가 존재하며 Binding 이라는 개념이 존재함
RabbitMQ 구성요소
- Producer : 요청을 보내는 주체이며 보내고자 하는 메시지를 Exchange 에 Publish 함
- Consumer : Producer 로 부터 메시지를 받아 처리하는 주체
- Exchange : Producer 로 부터 전달받은 메시지를 어떤 메시지 큐로 전송할지 결정하는 장소 (라우팅 기능)
- Queue : Consumer 가 소비하기 전까지 메시지가 보관되는 장소
- Binding : Exchange 와 Queue 와의 관계
- 특정 Exchange 가 특정 Queue 에 메시지를 보내도록 정의함
RabbitMQ 특징 및 장점
RabbitMQ 는 AMQP 프로토콜을 구현해 놓은 오픈 소스 메시지 브로커
- AMQP 을 구현해 놓은 메시지 큐
- 신뢰성,안전성과 성능을 충족할 수 있도록 다양한 기능을 제공
- Broker 중심적인 형태
- 유연하고 복잡한 라우팅이 가능
- 관리 UI 존재
- 거의 모든 언어와 운영체제를 지원
- 20kb/sec 정도의 속도
- 데이터 처리 보단, 관리적 측면이나 다양한 기능 구현을 위한 서비스를 구축할 때 사용
RabbitMQ 처리 구조
- Producer 가 Broker 로 메시지를 보냄
- Broker 내 Exchange 에서 해당하는 Key 에 맞게 Queue 에 분배 (Binding)
- 해당 Queue 를 구독하는 Consumer 가 메시지를 소비
RabbitMQ 단점
- 메시지 큐 서버가 종료 후 재가동시 큐 내용은 모두 삭제 (데이터 손실 위험)
- Producer 와 Consumer 의 결합도가 높음
2. ActiveMQ
JMS(Java Message Service): 메시지 큐 및 Publish - Subscribe 패턴과 같은 메시지 기반 통신을 추상화하고 표준화한 API
Java MOM 표준 API 이며 소프트웨어 응용 프로그램 구성 요소가 소비하는 요청, 보고서 또는 이벤트로 메시지를 작성, 전송, 수신 및 읽을 수있는 메시징 표준
JMS는 다른 시스템의 프로그램이나 다른 프로그래밍 언어로 작성된 프로그램이 메시지를 통해 서로 조정할 수 있도록 함

ActiveMQ 는 JMS 스펙을 좀 더 사용하기 편리하게 구현한 오픈소스 메시지 브로커
RabbitMQ 와 더불어 현재 대표적인 메시지 브로커로 사용되고 있음
ActiveMQ 구성 요소
- Message Broker : 목적지에 안전하게 메시지를 건네주는 중개자 역할
- Destination : 목적지에 배달될 2가지 메시지 모델 Queue 와 Topic
- Queue : 메시지가 전달되는 통로 (경합이 있음)
- Topic : Queue 와 비슷한 역할 그러나, 여러 Consumer 에게 메시지를 건네줄 수 있음 (경합이 없음)
ActiveMQ 처리 모델
- Queue 모델: 메시지를 받는 Consumer 가 다수일 때 연결된 순서 로 메시지가 제공
- Topic 모델: 메시지를 받는 Consumer 가 다수일 때 메시지는 모두에게 제공.

ActiveMQ 는 일반적인 메시지큐의 특징 및 장점을 가지고 있으며 AMQP 기반의 RabbitMQ 을 사용하는 프로세스와의 통신은 불가능함
3. Apache Kafka
카프카(Kafka): Linked-in 에서 개발한 파이프라인, 스트리밍 분석, 데이터 통합 및 미션 크리티컬 애플리케이션을 위해 설계된 고성능 분산 이벤트 스트리밍 플랫폼
Pub-Sub 모델의 메시지 큐 형태로 동작하며 분산환경에 특화되어 있으며, Fortune 100개 기업 중 80% 이상이 Kafka를 사용함
Kafka 는 메시지 브로커인 RabbitMQ, ActiveMQ 와는 달리 이벤트 브로커

대용량 실시간 로그처리에 특화되어 설계된 메시징 시스템으로 TPS가 매우 우수
메시지를 메모리에 저장하는 기존 메시징 시스템과는 달리 파일에 저장을 하는데 그로 인해 카프카를 재시작해도 메시지 유실 우려가 감소
기본 메시징 시스템(rabbitMQ, ActiveMQ)에서는 브로커(Broker)가 컨슈머(consumer)에게 메시지를 push해 주는 방식인데, 카프카는 컨슈머(Consumer)가 브로커(Broker)로부터 메시지를 직접 가져가는 PULL 방식으로 동작하기 때문에 컨슈머는 자신의 처리 능력만큼의 메시지만 가져와 최적의 성능을 낼 수 있음
언제 사용?
대용량 분산 시스템이 필요하면 Kafka 을 구축
그 외에는 Queue 기능에서 신뢰성과 안전성을 좀 더 보장하는 ActiveMQ 혹은 RabbitMQ 을 사용
참고
