컴퓨터 시스템에서, 다른 프로세스나 컴포넌트 간의 메시지를 안전하고 효율적으로 전달하기 위한 소프트웨어 혹은 서비스를 의미한다.
큐 자체는 선입 선출의 구조를 가진 자료구조이다. 입구와 출구를 가지고 있으며, 다수의 입력이 존재하는 경우, 먼저 큐에 입구로 삽입된 순으로 출구로 나가게 된다.
메시지 큐는 큐 자료구조의 특징을 활용하여, 메시지(임의의 작업)를 전달하는 Producer
부분 (입구), 메시지를 받아 이를 소비하는 Consumer
부분 (출구)에게 전달하는 매개체이다.
메시지 지향 미들웨어 (MOM)
메시지 지향 미들웨어는 각 분산되어 있는 어플리케이션 간의 메시지를 교환하고 통신을 하기 위한 브릿지 역할을 담당하는 미들웨어를 의미한다.MOM
을 구현한 시스템을 흔히 메시지 큐라고 부른다.
미들웨어
미들웨어는 서로 다른 프로그램 혹은 어플리케이션 사이에서 서로 간의 통신과 상호작용을 돕는 소프트웨어 혹은 기술을 의미한다.
자바스크립트에서 API 통신 시 비동기 제어를 위해 이벤트 루프가 사용되는데, 이 중 테스크 큐의 작동 방식이 메시지 큐와 동작과 매우 유사하다.
비동기 함수의 작업을 백그라운드 (Browser API, Node.js 엔진) 에서 완료하는 경우, 테스크 큐에는 그 결과들이 순서대로 반영된다. 즉, 테스크 큐는 수행완료를 기점으로 백그라운드 Producer
의 결과 메시지를 콜스택 Consumer
에게 전달하는 매개체가 되는 것이다.
이메일, SMS, 푸시 등의 경우 작업이 완료되었을 때, 해당 작업을 관리하는 서비스로 부터, 알림 시스템을 관리하는 서비스에 통신을 보내게 되는데 이 때 메시지 큐가 활용된다.
키보드나 마우스를 통해 발생하는 사용자 입력을 프로세스에 전달하는 용도로 메시지 큐가 활용된다. 이는 요청 처리에 대한 작업 순서 보장과, 담당하는 영역 이상의 입력이 들어오는 경우 부하가 일어나는 것을 방지하기 위한 목적으로 사용된다.
메시지 큐를 대규모 트래픽을 감당해야하는 어플리케이션의 장점에 맞게 확장한 기술로, 기존 메시지 큐는 전달하는 쪽에서 전달 받는 쪽으로 메시지를 전달하는 매개체로서의 의미를 가지고 있다면, 메시지 브로커는 더 광범위한 전송과 라우팅을 허용한다.
메시지 큐는 개별 메시지 큐 설계를 통해 P2P
방식으의 1:1
의 메시지 중계를 제공한다면, 메시지 브로커는 중앙 집중식 아키텍처를 채택하여, 1:N
, N:1
의 브로드 캐스트 스타일의 메시지 중계를 제공한다.
마이크로 서비스 아키텍처 및 대규모 분산 시스템의 강점들은 대부분 메시지 큐(메시지 브로커)가 그 핵심역할을 담당한다.
예를 들어, 회원가입을 완료하면, 쿠폰을 전달하는 서비스가 있다고 해보자.
해당 요청의 회원가입 완료 → 쿠폰 전달 라는 순서가 분명한 작업이다. 그러나, 이를 동기적으로 처리하는 경우에는, 회원가입이 늦어지면 쿠폰 응답도 함께 늦어지거나, 쿠폰 전달에서 에러가 발생하여 회원가입이 되지 않는 문제가 발생할 수 있다. 즉 임의의 순서의 문제가 다른 작업에 영향을 미칠 수 있다는 것이다.
이를 메시지 브로커를 활용한 비동기 작업을 통해 개선하는 것이 가능하다. 다른 작업에 대해 순서를 기다리지 않고, 서비스 영역에서는 자신이 수행할 작업을 병렬적으로 처리할 수 있다. 기존 동기식 대비 빠른 프로세스 실행이 가능하다.
MSA
는 서비스 영역별로 서버 인스턴스와 DB
를 쪼개어, 각 기능들이 독립적으로 운영되는 아키텍처이다. 기능이 명확히 나뉘어, 문제가 발생하여도 다른 서비스에 영향을 미치지 않는다는 장점을 가진다.
그러나 실제 서비스를 접하다 보면, 기능을 나누었을지라도, 한번의 요청에 여러 기능이 수행되거나 여러 DB
가 업데이트 되어야 하는 경우가 항상 존재한다. MSA
는 서비스가 모두 나뉘어 있는데, MSA
에서는 여러 기능을 한번에 처리할 수는 없는 것인가?
MSA
의 형태를 유지하면서도 이를 가능하게 하는 방법이 바로 메시지 브로커이다. 각 마이크로 서비스 간 메시지 통신을 통해, 여러 기능이 순차적으로 진행할 수 있도록 하는 것이 가능하다.
메시지 브로커의 부하에 따른 Scale out
(수평적 확장)이 가능하다. 클라이언트의 요청이 급증하는 경우, 메시지 큐는 Producer
와 Consumer
의 인스턴스를 추가하여, 수직적 확장 대비 비용 소모가 적은 확장을 이루는 것이 가능하다.
이벤트 브로커는 예상치 못한 통신 장애에 대하여, 메시지를 보류하고 모듈을 복구시킨 후, 추후 재전송하여 해당 작업을 수행하도록 하는 것이 가능하다. 또한, 낮은 결합도를 유지하여 장애에 대한 전파를 최소화 할 수 있다는 특징을 가진다.
참고
[마이크로서비스] MSA의 핵심 구성 요소 - Message Queueing
Message Queue 정리
메시지 큐를 활용한, 유연한 전송 구조 만들기
[SC05] Spring Cloud Bus 란 ?
메시지 큐를 이용한 비동기처리 및 에러 처리 | 개발자 이동욱
4월4일 - 메시지 큐와 브로커
RebbitMQ VS Kafka 비교 분석하기