메시지 큐(Message Queue, MQ)란?
프로그램(프로세스) 간의 데이터를 교환할 때 사용하는 기술이다.
메시지 큐는 메시지 지향 미들웨어(Message Oriented Middleware, MOM)를 구현한 시스템이다.
1만 개의 요청이 발생했을 때 모든 요청을 서버로 보내는 것이 아니라 메시지 큐에 보낸다. 서버 측에서는 처리하는데 이상 없을 정도의 요청들만 메시지 큐에서 가져와서 처리한다면 서버의 부담을 줄일 수 있다.
👀메시지 지향 미들웨어(Message Oriented Middleware, MOM)
메시지 지향 미들웨어는 응용 소프트웨어 간의 데이터 통신을 위한 소프트웨어이다. 일반적으로 비동기 메시지 전달에 기초한다.
- 장점
- 많은 메시지 지향 미들웨어는 메시지의 백업을 유지한다. 따라서 네트워크의 품질이 낮거나 연결 시간에 제한이 있는 경우, 메시지 지향 미들웨어를 사용하는 것이 유용하다.
- 미들웨어 계층 자신이 직접 메시지 ⑴라우팅이 가능하다. 메시지 라우팅을 이용하면 미들웨어에서 하나의 메시지를 여러 수신자에게 배포할 수 있다.(멀티캐스트)
- 송신 측과 수신 측의 요구에 따라 메시지의 변환이 가능하다. 응용 프로그램이 메시지를 자신의 형식으로 발송할 수 있고, 여러 개의 수신 응용 프로그램 고유의 형식으로 변환된 메시지를 받을 수 있다.
- 단점
- 아키텍처에 외부 구성 요소인 메시지 전송 에이전트를 필요로 한다.
따라서 새로운 요소를 추가하면서 시스템 성능이 저하되고, 신뢰성도 떨어진다. 또한 시스템 전체로 볼 때 관리가 어렵고 비용도 발생한다.
- 애플리케이션 간의 통신은 본질적으로 동기이며, 전송 처리를 계속하기 전에 응답을 기다리도록 되어 있는 것이 보통이다. 반면 메시지 지향 미들웨어는 본질적으로 비동기이다. 그에 따라 불일치가 발생할 수 있다.
특징
- 비동기(Asynchronous) : 데이터를 수신자에게 바로 보내지 않고 큐에 넣고 관리하기 때문에 나중에 처리 가능
- 비동조(Decoupling) : 애플리케이션과 분리할 수 있기 때문에 확장이 용이
- 탄력성(Resilience) : 일부가 실패하더라도 전체에 영향을 주지 않음
- 과잉(Redundancy) : 실패할 경우 재실행 가능
- 보증(Guarantees) : 작업이 처리된 것을 확인할 수 있음
- 확장성(Scalable) : N:1:M 구조로 다수의 프로세스들이 큐에 메시지를 보낼 수 있음
사용하는 예시
- 다른 곳의 API로부터 데이터 송수신
- 다양한 Application에서 비동기 통신 가능
- 이메일 발송 및 문서 업로드 가능
- 많은 양의 프로세스 처리
대표적인 메시지 큐
1. RabbitMQ
AMQP 프로토콜을 구현해 놓은 메시지 큐이고 직관적이라는 특징을 가지고 있다.
- 신뢰성과 안정성이 있음
- 유연한 라우팅
-> 메시지 큐가 도착하기 전에 라우팅 되며 ⑵플러그인을 통해 더 복잡한 라우팅도 가능
- 클러스터링
-> 로컬 네트워크에 있는 여러 RabbitMQ 서버를 논리적으로 클러스터링 할 수 있고 논리적인 브로커도 가능
- 관리 UI가 있어서 편하게 관리 가능
- 거의 모든 언어와 운영체제를 지원
- 오픈소스로 상업적 지원 가능
2. ActiveMQ
Java로 만든 오픈소스 메시지 브로커이다. 자바 뿐만 아니라 다른 언어를 사용하는 클라이언트를 지원한다.
- 다양한 언어와 프로토콜 지원(Java, C, C++, C#, Ruby, Perl, Python, PHP 클라이언트 지원)
- OpenWire를 통해 고성능의 Java, C, C++, C# 클라이언트 지원
- Stomp를 통해 C, Ruby, Perl, Python, PHP 클라이언트가 ActiveMQ에 접근 가능
- Message Groups, Virtual Destinations, Wildcards와 Composite Destinations 지원
- JMS 1.1과 J2EE 1.4를 지원하며, transient, persistent, transactional, 그리고 XA 메시징 지원
- Spring 지원으로 ActiveMQ는 Spring 애플리케이션에 매우 쉽게 임베딩 될 수 있으며, Spring의 XML 설정 메커니즘에 의해 쉽게 설정 가능
- Geronimo, JBoss 4, GlassFish, 그리고 WebLogic과 같은 인기 있는 J2EE 서버들과 함께 테스트됨
- Inbound와 Outbound 메시징을 위한 JCA 1.5 Resource Adapter를 포함하여 ActiveMQ가 J2EE 1.4 호환 서버에 자동 배치됨
- In-VM, TCP, SSL, NIO, UDP, Multicast, JGroups, 그리고 JXTA Transport들과 같은 플러그인 가능한 전송 프로토콜들을 지원
- 고성능의 저널을 사용할 때에 JDBC를 사용하여 매우 빠른 Persistnece를 지원
- 고성능의 클러스터링, 클라이언트-서버, Peer 기반 통신을 지원을 위한 설계가 되어 있음
- REST API를 통해 웹 기반 메시징 API를 지원
- 웹브라우저가 메시징 도구가 될 수 있도록, Ajax를 통해 순수한 DHTML을 사용한 웹 스트리밍 지원
- In-memory JMS Provider로 사용될 수 있으며, 이는 JMS를 사용한 단위 테스트에 적합한 솔루션을 제공
- STOMP, AMQP, MQTT, Openwire, SSL, and WebSockets
3. ZeroMQ
중앙 집중형 브로커 없이 메시지 전달 가능하지만 브로커가 제공하는 영속성 및 전달 보장성은 없다.
ZeroMQ는 대부분 AMQP들보다 단위가 다를 정도로 빠르다.
- 복잡한 프로토콜이 없음
- 신뢰성 있는 멀티캐스트나 Y-suite IPC 전송같은 효율적인 전송을 활용
- 지능적인 메시지 묶음을 활용한다.
-> 이것은 ZeroMQ로 하여금 프로토콜 오버헤드뿐만 아니라 시스템 호출을 줄여 TCP/IP를 효율적으로 사용하게 해준다.
- 요청-응답(REQ-REP) 패턴, 발행-구독(PUB-SUB) 패턴 제공
- PUSH-PULL 방식을 제공해, 단 방향으로 흐르는 데이터 스트림을 다루는
4. Kafka
확장성과 고성능 및 높은 처리량을 특징으로 내세웠다. 특화된 시스템이기 때문에 다른 범용 메시징 시스템에서 사용하는 다양한 기능을 제공하지는 않는다. 그리고 분산 시스템을 기본으로 설계되어 있기 때문에 기존 메시징 시스템에 비해 분산 및 복제 구성이 손쉽다.
- 대용량 실시간 로그 처리에 특화
- AMQP 프로토콜이나 JSM API를 사용하지 않고 단순한 메시지 헤더를 지닌 TCP 기반 프로토콜 사용함으로써 오버헤드가 비교적 작음
- 노드 장애에 대한 대응성을 가짐
- 프로듀서는 각 메시지를 배치로 브로커에게 전달하여 TCP/IP 라운드 트립을 줄임
- 메시지를 기본적으로 파일 시스템에 저장하여 별도의 설정을 하지 않아도 오류 발생 시 오류 지점부터 복구가 가능 (기존 메시징 시스템은 메시지를 메모리에 저장)
- 메시지를 파일시스템에 저장하기 때문에 메시지가 많이 쌓여도 기존 메시징 시스템에 비해 성능이 크게 감소하지 않음
- window 단위의 데이터를 넣고 꺼낼 수 있음
주석
⑴라우팅 : 네트워크에서 경로를 선택하는 프로세스이다. 컴퓨터 네트워크는 노드라고 하는 여러 시스템과 이러한 노드를 연결하는 경로 또는 링크로 구성된다. 두 노드 간의 통신은 여러 경로를 통해 이루어질 수 있다. 라우팅은 미리 정해진 규칙을 사용하여 최상의 경로를 선택하는 프로세스이다.
⑵플러그인 : 콘센트에 플러그를 꼽는 것처럼 본체 프로그램에 없던 어떤 기능을 더해 넣는(add-in) 컴퓨터 프로그램이다.
참고자료
1) https://sorjfkrh5078.tistory.com/291
2) https://m.blog.naver.com/seek316/222117711303
3) 메시지 지향 미들웨어
https://ko.wikipedia.org/wiki/%EB%A9%94%EC%8B%9C%EC%A7%80_%EC%A7%80%ED%96%A5_%EB%AF%B8%EB%93%A4%EC%9B%A8%EC%96%B4