취업을 하게 되면서 처음으로 쓰는 포스팅이다. 회사를 다닌 지 어느덧 한 달이라는 시간이 흘렀고, 짧다면 짧고 길다면 긴 한 달을 회사에 적응하기 위해 노력했다. 물론 퇴근하고 공부를 하려고 마음먹었지만 생각처럼 의자에 앉아있는 게 쉽지 않았다. 차일피일 미루다 보면 허송세월 하게 될 것 같아서 지금이라도 틈틈이 공부를 하려고 한다. 그래서 취업 후 첫 포스팅은 '메시지 큐'에 대해 쓰고자 한다.
메시지 큐(Message Queue)란 ?
메시지 큐는 Message Queue 혹은 MQ라고 부른다. 사람들이 MQ라고 줄여서 많이 부르는 것으로 보아 MQ라고 해도 의미 전달이 될 것이다.(이 포스팅에서는 MQ라고 부르기로 하자.)
MQ는 메시지 지향 미들웨어(Message Oriented Middleware)로 메시지를 이용하여 여러 애플리케이션이나 서비스, 시스템을 연결해주는 솔루션이다. 그래서 비동기 메시지를 사용하는 서비스들 사이에서 데이터를 교환해주는 역할을 한다.
그림을 통해 MQ에 대해 보면 MQ는 메시지를 임시로 저장하는 간단한 버퍼라고 보면 된다. 메시지를 전송하기 위해 중간에 MQ를 두는 것이다.
PRODUCER가 메시지를 큐에 전송하면 CONSUMER가 처리하는 방식으로, PRODUCER와 CONSUMER 사이에 메시지 프로세스가 추가되는 것이 특징이다.
MQ의 이점
1. 비동기
→ MQ는 생산된 메시지의 저장, 전송에 대해 동기화 처리를 하지 않고, 큐에 넣어두기 때문에 나중에 처리할 수 있다.
2. 낮은 결합도
→ PRODUCER와 CONSUMER가 독립적으로 행동하게 됨으로써 서비스 간 결합도가 낮아진다.
3. 확장성
→ PRODUCER 또는 CONSUMER를 원하는 대로 확장할 수 있다.
4. 탄력성
→ CONSUMER가 다운이 되더라도 메시지는 MQ에 남아있기 때문에 CONSUMER가 다시 시작되면 추가 설정이나 작업을 하지 않아도 메시지 처리를 할 수 있다.
5. 보장성
→ MQ는 큐에 저장된 모든 메시지가 결국 CONSUMER에게 전달된다는 것을 보장한다.
MQ 사용 예시
단순히 데이터를 전송하는 것 말고 MQ가 일상생활에서 어떤 경우에 쓰이는지 궁금해서 예시를 찾아보았다.
이메일 전송
일상생활에서 비밀번호를 잊어버린 경우 가입한 이메일로 임시 비밀번호를 발급받아서 로그인을 하고 임시 비밀번호를 실제 사용할 비밀번호로 바꾼다. 혹은 회원가입을 할 때, 이메일 인증 과정에서 이메일로 인증 번호를 받아서 이메일을 인증해본 경험은 누구나 있을 것이다. 이때 MQ를 사용하여 해당 서비스를 제공할 수 있다.
이런 상황에서 대부분 이메일을 들어가면 메일이 먼저 도착하지만, 가끔 메일이 도착하지 않아서 새로 고침을 몇 번이고 한 경험을 필자는 가지고 있다. 여기서 위에서 설명한 MQ의 이점을 보여준다고 할 수 있다. 앞서 말했듯 MQ는 '비동기'라는 이점을 가지기 때문에 요청하자마자 바로 응답이 오지 않을 수도 있다.
(이전에 일정관리 프로젝트를 하면서 이메일 인증을 구현해보았는데, 추후에 간단하게 포스팅해보려고 한다.)
그러므로 MQ는 지금 바로 처리가 되는 것보다 언젠가 처리가 되겠지라는 믿음이므로 애플리케이션의 핵심 기능보다는 이메일 인증 같은 부가적인 작업을 처리할 때 사용한다.
MQ의 종류
1. Apache ActiveMQ
- Java 기반의 JMS Queue를 지원하는 오픈소스로 MQTT, AMQP, OpenWire, STOMP 프로토콜을 지원한다.
- 다양한 언어를 지원하며 클러스터링이 가능하다. 단, 모니터링 도구는 없다.
- REST API를 통해 웹 기반 메시징 API를 지원하며 Ajax를 통해 순수한 DHTML을 사용한 웹 스트리밍 지원을 한다.
- ActiveMQ의 JMS 라이브러리를 사용한 자바 애플리케이션끼리 통신이 가능하지만, ActiveMQ가 아닌 애플리케이션과는 통신할 수 없다.
2. Rabbit MQ
- 고성능을 목표로 AMQP(Advanced Message Queuing Protocol)을 사용하여 개발된 MQ로 Erlang OTP 기반으로 개발되었다. 그래서 AMQP를 사용한 다른 애플리케이션이랑 통신이 가능하다.
- 실시간 모니터링이 용이하고 다양한 언어 및 OS 지원, RabbitMQ 서버 간 클러스터링이 가능하다.
- 바인딩으로 라우팅 할 규칙을 지정함으로써 특정 조건에 맞는 메시지를 특정 큐에 전송할 수 있다.
3. Kafka
- LinkedIn에서 구직정보들을 처리할 수 있는 플랫폼으로 개발이 시작되었다.
- 실시간 로그 처리에 특화되어 설계된 시스템으로 개발되어 타 MQ 대비 TPS가 매우 우수하나 특화된 솔루션이기 때문에 타 MQ 솔루션에서 제공하는 다양한 기능들은 제공되지 않는다.
- AMQP, JMS 이 아닌 단순 메시지 헤더를 이용한 TCP 통신이다.
- MQ는 broker가 producer에게 메시지를 받아서 consumer에게 push 해 주는 방식인데 반해, Kafka는 consumer가 broker로부터 직접 메시지를 가지고 가는 pull 방식으로 동작하기 때문에 consumer는 자신의 처리능력만큼의 메시지만 broker로부터 가져오기 때문에 최적의 성능을 낼 수 있다.
- 많은 데이터 전송과 최대 처리량을 유지하기에 대량 데이터 스트리밍에 적합하다.
- 상태 변경이 시간순으로 기록되어야 하는 응용 프로그램인 이벤트 소싱(Evenet Sourcing) 저장소로 적합하다.
REFERENCE
'기타' 카테고리의 다른 글
[Linux] 리눅스 명령어와 친구가 되어보자! ( 관리 명령어편 ) (1) | 2022.11.01 |
---|---|
인증번호 전송 기능을 구현해보자! (6) | 2022.09.21 |
동기와 비동기의 차이(+ 블로킹과 논블로킹) (0) | 2022.07.22 |