The Office Lover
메세지 큐(Message Queue) 본문
메시지 큐(Message Queue)란?
- 프로세스(프로그램) 간에 데이터를 교환할 때 사용하는 통신 방법 중에 하나로 더 큰 개념으로는 MOM(Message Oriented Middleware : 메시지 지향 미들웨어 이하 MOM)을 의미
- MOM이란 비동기 메시지를 사용하는 프로그램 간의 데이터 송수신을 의미하는데 MOM을 구현한 시스템을 MQ라고 한다. MQ는 작업을 늦출 수 있는 유연성을 제공한다.
- 메시지를 교환할 때 AMQP(Advanced Message Queuing Protocol 이하 AMQP)를 이용한다.
- AMQP는 ISO응용 계층의 MOM 표준으로 JMS(Java Message Service)와 비교되는데 JMS는 MOM을 자바에서 지원하는 표준 API다.
- JMS는 다른 Java Application 간에 통신은 가능하지만 다른 MOM(AMQP, SMTP 등)끼리는 통신할 수 없다.
- 그에 반해 AMQP는 protocol만 일치한다면 다른 AMQP를 사용한 Application과도 통신이 가능하다. AMQP는 wire-protocol을 제공하는데 이는 octet stream을 이용해서 다른 네트워크 사이에 데이터를 전송할 수 있는 포맷이다.
메시지 큐의 장점
- 비동기 : Queue에 넣기 때문에 나중에 처리할 수 있다.
- 비동조 : Application과 분리할 수 있다.
- 탄력성 : 일부가 실패 시 전체는 영향을 받지 않는다.
- 과잉 : 실패할 경우 재실행이 가능하다.
- 확장성 : 다수의 프로세스들이 큐에 메시지를 보낼 수 있다.
메시지 큐의 사용처
- 다른 곳의 API로부터 데이터 송수신
- 다양한 Application에서 비동기 통신 가능
- 이메일 발송 및 문서 업로드 가능
- 많은 양의 프로세스 처리
메시지 큐의 종류
- Kafka
- RabbitMQ
- ActiveMQ
공통적으로 3가지 모두 비동기 통신을 제공하고 보낸 사람과 받는 사람을 분리한다. 하지만 업무에 따라서 다른 목적을 가지고 있다.
Kafka | RabbitMQ, ActiveAQ(Apache) |
---|---|
처리량이 많은 분산 메시징 시스템에 적합 | 신뢰성 있는 메시지 브로커가 필요한 경우 적합 |
※ 여기서 신뢰성은 Kafka에 비해 높은 것이지 Kafka가 신뢰성이 없다는 것은 아니다.
메시지 큐 종류별 장점
1. Kafka
Kafka는 확장성과 고성능 및 높은 처리량을 내세운 제품이다. 특화된 시스템이기 때문에 범용 메시징 시스템에서 제공하는 다양한 기능들은 제공되지 않는다. 분산 시스템을 기본으로 설계되었기 때문에 기존 메시징 시스템에 비해 분산 및 복제 구성을 손쉽게 할 수 있다.
- 대용량 실시간 로그 처리에 특화
- AMQP 프로토콜이나 JSM API를 사용하지 않고 단순한 메시지 헤더를 지는 TCP기반 프로토콜을 사용함으로써 오버헤드가 비교적 작다.
- 노드 장애에 대한 대응성을 가지고 있다.
- 프로듀서는 각 메시지를 배치로 브로커에게 전달하여 TCP/IP 라운드 트립을 줄였다.
(라운드 트립 : 클라이언트와 서버 간의 데이터 왕복 과정을 의미한다. 라운드 트립이 빈번하다는 것은 클라이언트와 서버 간에 요청과 응답이 빈번하다는 이야기이고, 결국 서버 측의 성능에 그리 좋지 않은 영향을 미친다. 따라서 라운드 트립이 적게 일어나도록 제작되는 것이 바람직하다.) - 메시지를 기본적으로 파일 시스템에 저장하여 별도의 설정을 하지 않아도 오료 발생 시 오류 지점부터 복구가 가능하다.
(기존 메시징 시스템은 메시지를 메모리에 저장) - 메시지를 파일시스템에 저장하기 때문에 메시지가 많이 쌓여도 기존 메시징 시스템에 비해 성능이 크게 감소하지 않는다.
- window 단위의 데이터를 넣고 꺼낼 수 있다.
2. RabbitMQ
RabbitMQ는 AMQP 프로토콜을 구현해 놓은 프로그램으로써 빠르고 쉽게 구성할 수 있으며 직관적이다.
- 신뢰성, 안정성
- 유연한 라우팅
(Message Queue가 도착하기 전에 라우팅 되며 플러그인을 통해 더 복잡한 라우팅도 가능) - 클러스터링
(로컬네트워크에 있는 여러 RabbitMQ 서버를 논리적으로 클러스터링 할 수 있고 논리적인 중개인도 가능) - 관리 UI의 편리성
(관리자 페이지 및 모니터링 페이지가 제공됨) - 거의 모든 언어 및 운영체제를 지원
- 오픈소스로 상업적 지원 가능
3. ActiveMQ
ActiveMQ는 자바로 만든 오픈소스 메시지 브로커이다. JMS 1.1을 통해 자바뿐만 아니라 다른 언어를 사용하는 클라이언트를 지원한다.
- 다양한 언어와 프로토콜 지원(Java, C, C++, C#, Ruby, Perl, Python, PHP 클라이언트 지원)
- OpenWire를 통해 고성능의 Java, C, C++, C# 클라이언트 지원
- Stomp를 통해 C, Ruby, Perl, Python, PHP 클라이언트가 다른 인기있는 메시지 중개인들과 마찬가지로 ActiveMQ에 접근 가능
- Message Groups, Virtual Destinations, Wildcard와 Composite Destination을 지원
- Spring 지원으로 ActiveMQ는 Spring Application에 매우 쉽게 임베딩될 수 있으며, Spring의 XML 설정 메커니즘에 의해 쉽게 설정 가능
- Geronimo, JBoss 4, GlassFish, WebLogic과 같은 인기있는 J2EE 서버들과 함께 테스트됨
- 고성능의 저널을 사용할 때에 JDBC를 사용하여 매우 빠른 Persistence를 지원
- REST API를 통해 웹기반 메시징 API를 지원
- 웹 브라우저가 메시징 도구가 될 수 있도록, Ajax를 통해 순수한 DHTML(Dynamic HTML)을 사용한 웹 스트리밍 지원
출처
'Backend' 카테고리의 다른 글
제어의 역전 - Inversion of Control (0) | 2023.08.11 |
---|---|
Java IO와 NIO (0) | 2023.07.21 |
Java blocking과 non-blocking (0) | 2023.07.21 |
Java Spring Framework - @Transactional (0) | 2023.07.20 |
@Transaction - isolation 격리 수준에 따른 세가지 현상 (0) | 2023.07.20 |