메시지 큐는 메시지의 무손실을 보장하는 비동기 통신을 지원하는 컴포넌트를 말한다.
메시지의 무손실 durability : 메시지 큐에 일단 보관된 메시지는 소비자가 꺼낼 때까지 안전히 보관된다.
메시지 큐는 버퍼 역할을 하며 비동기적으로 전송된다.
메시지 큐
는 프로세스 또는 프로그램 간에 데이터를 교환할 시 사용하는 통신 방법 중 하나로 메시지 지향 미들웨어Message Oriented Middleware , MOM
을 구현한 시스템을 의미한다.
메시지 지향 미들웨어
: 비동기 메시지를 사용하는 응용 프로그램들 사이에서 데이터를 송수신하는 것메시지
: 요청, 응답, 오류 메시지 혹은 단순한 정보같은 작은 데이터
메시지 큐는 메시지를 임시로 저장하는 간단한 버퍼같은 것이다.
생산자 / 발행자 (producer / publisher)
라 불리는 입력 서비스(컴포넌트)
가 메시지를 만들어 메시지 큐에 발행 publish
한다.소비자 혹은 구독자 ( consumer / subscriber )
라 불리는 서비스 혹은 서버가 연결되어 있는데 메시지를 받아 그에 맞는 동작을 수행한다.이미지 출처 : https://product.kyobobook.co.kr/detail/S000001033116
메세지 큐 이용시 서비스 혹은 서버 간 결합이 느슨해져 규모 확장성이 보장되어야 하는 안정적인 애플리케이션을 구성하기 좋다.
생산자는 서비자 프로세스가 다운되어 있어도 메시지를 발행할 수 있고 소비자는 생산자 서비스가 가용한 상태가 아니라더라도 메시지를 수신할 수 있다.
각 메시지는 하나의 소비자에 의해 한 번만 처리될 수 있는데 이런 이유로 메시지 큐를 이용하는 방식을 일대일 통신이라고 부른다.
일반적인 클라이언트 - 서버 구조에서 사용자의 요청이 들어오면 서버는 그에 대해 처리를 한 후 클라이언트에게 응답을 한다. 그래서 간단한 구조에서는 메시지 큐가 굳이 필요없다.
메시지 큐는 소비자가 실제로 메시지를 어느 시점에 가져가서 처리하는지를 보장하지 않는다. 언젠가 큐에 저장한 메시지가 소비되어 처리될 것이라 믿는 것이다. 이런 비동기적 특성으로 인해 실패시 치명적인 핵심 작업보다 부가적인 기능에 사용하는 것이 적합하다.
처리율 제한 장치를 사용하는 경우 클라이언트로부터 API 서버로의 요청이 처리율 제한 미들웨어에 먼저 도착했을때 처리율 제한 규칙 과 레디스에 저장되어 있는 카운터, 타임스탬프를 고려한 결과 처리율 제한에 걸렸을 경우 해당 요청을 그대로 버릴 수 있고 메시지 큐에 보관할 수도 있다.
이미지 출처 : https://product.kyobobook.co.kr/detail/S000001033116
처리율 제한 알고리즘에 토큰 버킷, 누출 버킷, 고정 윈도 카운터, 이동 윈도 로그, 이동 윈도 카운터 등의 알고리즘들이 있는데 메시지 큐를 사용하지 않을 경우 처리율 제한 한도를 초과했을때 요청이 모두 버려지는데 메시지 큐를 사용할 경우 요청을 발행자가 메시지 큐에 저장해 두었다가 소비자가 나중에 사용할 수 있는 것으로 보인다.
이메일 인증의 경우 이메일이 즉각적으로 수신되기를 기대하지는 않는다. 어느 정도 응답 지연이 허용되며 어플리케이션의 핵심 기능이 아니니 메시지 큐가 이런 경우 도움이 될 수 있다.
이미지 출처 : https://sharmarajdaksh.github.io/blog/the-what-why-and-how-of-message-queues
디커플링 Decoupling, 낮은 결합도 - 소비자와 생산자의 운영은 서로 완전히 독립적이다.
확장성 Scalable - 필요에 따라 생산자와 소비자의 수를 쉽게 확장 가능하다.
탄력성 - 소비자 프로세스가 중단되더라도 애플리케이션의 중단을 의미하지 않는다. 소비자에 대한 메시지는 메시지 대기열에 남아있다. 소비자 서비스가 다시 시작될 때마다 추가 설정이나 작업을 수행할 필요 없이 메시지 처리를 시작할 수 있다.
전달 보장 - 메시지 대기열은 대기열에 푸시된 모든 메시지가 최종적으로 소비자에게 전달되는 것을 보장한다.
주문 보장 - 대기열이기에 주문은 들어오는 메시지와 암묵적으로 연결된다. 데이터 소비 및 처리에도 동일하게 적용된다.
비동기 - 메시지 큐는 생산된 메시지의 저장, 전송에 동기화 처리를 진행하지 않고 큐에 넣어두기에 나중에 처리할 수 있다. 기존 동기화 방식은 많은 메시지가 전송될 경우 병목이 생길 수 있고 뒤에 들어오는 요청에 대한 응답이 지연될 것이다.
메시지 큐에는 RabbitMQ, Kafka, ActiveMQ 같은 오픈소스 시스템이 존재하는데 각 시스템별 비교 분석 후 현재 도입하고자 하는 서비스에 적합한 시스템을 선정하여 사용하자.
book
가상 면접 사례로 배우는 대규모 시스템 설계 기초
reference
tecoble - 메시지 큐에 대해 알아보자!
Dakshraj Sharma - The what, why, and how of Message Queues