메시지 큐(Message Queue)?? 그게 뭔데

메시지 큐(Message Queue)는 메시지 지향 미들웨어(Message Oriented Middleware:MOM)를 구현한 시스템을 의미한다

메시지 큐(Message Queue)?? 그게 뭔데
Photo by Volodymyr Hryshchenko / Unsplash

메시지 큐란??

메시지 큐(Message Queue) 는 메시지 지향 미들웨어(Message Oriented Middleware:MOM)를 구현한 시스템을 의미한다
결국 프로세스 또는 프로그램 간에 데이터를 교환할 때 사용하는 통신 방법 중에 하나이다

응용 소프트웨어 간의 데이터 통신을 위한 소프트웨어이며, 일반적으로 비동기 메시지 전달에 기초한 것을 가리킨다

메시지 큐는 "메시지", 즉 애플리케이션에서 다른 애플리케이션이 이용할 수 있도록 생성하는 데이터 패킷을 전송되는 순서대로 이용하는 애플리케이션에서 해당 메시지를 처리할 수 있는 상태가 될 때까지 저장한다

여기서 메시지란 요청, 응답, 오류 메시지 혹은 단순한 정보 등의 작은 데이터를 의미한다

그러면 메시지는 수신 애플리케이션에서 준비될 때까지 대기하게 된다
즉, 네트워크나 수신 애플리케이션에 문제가 생기더라도 메시지 큐에 있는 메시지는 사라지지 않게 된다

이렇게 말로만 얘기하면 너무 어렵다..

밑 그림을 보면

Producer, 즉 생산자가 메시지를 메시지 큐에 추가한다
Consumer, 즉 소비자가 메시지를 검색하고 작업을 수행할 때까지 메시지는 큐에 남아있게 된다

많은 생산자와 소비자가 대기열을 사용할 수 있지만 각 메시지는 하나의 Consumer에 의해 처리 된다

둘 이상의 소비자가 메시지를 처리해야 하는 경우 Pub/Sub 메시징 등을 사용한다

그래서 왜 쓰는데??

해당 비동기 식 메시징 이라 하는 모델은 데이터 손실을 방지하고, 프로세스나 연결이 종료 되더라도 메시지가 소실되지 않는다

이런 기능은 일반적인 Client-Server 구조에서는 굳이 사용할 이유가 없다
그냥 요청을 받고 처리를 해 응답을 해주면 된다

만약 대용량 데이터, 채팅 서비스, 비동기 작업 등을 지원해야 된다면??

장점

  • 비동기(Asynchronous)
    • 데이터를 수신자에게 바로 보내지 않고 큐에 넣고 관리하기 때문에 나중에 처리 가능
      • 기존 동기 방식은 병목이 생길 수 있음
  • 낮은 결합도(Decoupling)
    • 애플리케이션과 분리할 수 있기 때문에 확장이 용이해짐
    • 생산자, 소비자가 독립적으로 행동하게 됨
  • 탄력성(Resilience)
    • 일부가 실패하더라도 전체에 영향을 주지 않음
    • 소비자가 다운되더라도 메시지는 살아있음
  • 보증(Guarantees)
    • 모든 메시지가 소비자 서비스에 전달된다는 보장을 해줌
    • 작업이 처리된 걸 확인할 수 있음
  • 확장성(Scalable)
    • N:1:M 구조로 다수의 프로세스들이 큐에 메시지를 보낼 수 있음
    • 따라서 생산자, 소비자를 원하는 대로 확장할 수 있음

결국은 서버가 부담을 줄이면서 사용자에게 빠르고 안정적으로 응답할 수 있는 지에 초점을 맞춘 기술이다

주로 앱 분리, 마이크로서비스, 서버리스 구조에서 사용한다

기타 메시징 모델 비교

pub/sub

메시지 큐

  • point to point
    생산자가 큐에 메시지를 넣고 소비자가 받아 처리한다
    이는 한번만 사용된다

pub/sub 메세징
메시지를 생성하는 쪽을 Publisher, 발행자
이용하는 쪽이 Subscriber, 구독자
라 한다

각 메시지는 하나의 토픽에 발행되고
그 토픽을 구독하는 모든 구독자가 메시지의 사본을 받는다

메시지 버스

메시지 버스는 엔터프라이즈 서비스 버스(ESB)의 유형중 하나이다

엔터프라이즈 서비스 버스(ESB)는 서로 다른 애플리케이션 간의 실시간 데이터 교환을 지원하는 소프트웨어 아키텍처 패턴이다

서비스가 분산형 시스템 아키텍처 내에서 디커플링된 상태로 독립적으로 작동하면서 유비쿼터스 방식으로 데이터에 액세스할 수 있게 해준다

유비쿼터스(Ubiquitous)란 언제 어디서나 편리하게 컴퓨터 자원을 활용할 수 있도록 현실 세계와 가상 세계를 결합한 것이다
사용자가 네트워크나 컴퓨터, 장소에 상관없이 자유롭게 네트워크에 접속할 수 있는 정보통신 환경을 의미한다

이 경우 모든 서비스 또는 애플리케이션이 공통 데이터 유형, 명령 세트, 통신 프로토콜을 공유해야 한다
모든 서비스가 메시지를 같은 유형으로 사용, 반환해야한다..

근데? 메시지 큐는 그럴 필요가 없다

웹 서비스

애플리케이션에서 직접 웹 서비스, SOAP, HTTP 등과 같은 표준 프로토콜 기반 API를 통해 통신할 수 있다

실제로 간단하고 구현하기 쉬워 자주 사용된다

근데 메시지 전달을 보장할 수 없다
또한 웹 서비스는 거의 동기식 통신 방식을 사용하여 비동기 상황에선 사용하기 어렵다
이런 동기식 방식은 서버와 클라이언트의 결합도를 높이게 될 수 있다

결론

메시징 큐에 대해 알아봤는데
기본적인 내용들에 대해서 먼저 찾아봤다

정말 기본적인 내용들이였고 이제 메시징 큐에는 어떤 것들이 있고 어떤 차이가 있는지도 정리해봐야겠다
주로 사용하는 RabbitMQ, Kafka 등등

  • 씁 Kafka는 걱정인게 하둡도 찾아봐야될거 같은데...

또 Pub/Sub 에 대해서 따로 정리해봐야겠다...