- 비동기 : Queue에 넣기 때문에 나중에 처리할 수 있다.
- 비동조 : Application과 분리할 수 있다.
- 탄력성 : 일부가 실패 시 전체는 영항을 받지 않는다.
- 과잉 : 실패할 경우 재실행이 가능하다.
- 확장성 : 다수의 프로세스들이 큐에 메시지를 보낼 수 있다.
- 다른 곳의 API로부터 데이터 송수신
- 다양한 Application에서 비동기 통신 가능
- 이메일 발송 및 문서 업로드 가능
- 많은 양의 프로세스 처리
- Kafka
- RabbitMQ
- ActiveMQ
공통적으로 3가지 모두 비동기 통신을 제공하고 보낸사람과 받는 사람을 분리한다. 하지만 업무에 따라서 다른 목적을 가지고 있다.
Kafka | RabbitMQ, ActiveAQ(Apache) |
---|---|
처리량이 많은 분산 메시징 시스템에 적합 | 신뢰성 있는 메시지 브로커가 필요한 경우 적합 |
Kafka는 확장성과 고성능 및 높은 처리량을 내세운 제품이다. 특화된 시스템이기 때문에 범용 메시징 시스템에서 제공하는 다양한 기능들은 제공되지 않는다. 분산 시스템을 기본으로 설계되었기 때문에 기존 메시징 시스템에 비해 분산 및 복제 구성을 손쉽게할 수 있다.
- 대용량 실시간 로그 처리에 특화
- AMQP 프로토콜이나 JSM API를 사용하지 않고 단순한 메시지 헤더를 지는 TCP기반 프로토콜을 사용함으로써 오버헤드가 비교적 작다.
- 노드 장애에 대한 대응성을 가지고 있다.
- 프로듀서는 각 메시지를 배치로 브로커에게 전달하여 TCP/IP 라운드 트립을 줄였다.
(라운드 트립 : 클라이언트와 서버 간의 데이터 왕복 과정을 의미한다. 라운드 트립이 빈번하다는 것은 클라이언트와 서버 간에 요청과 응답이 빈번하다는 이야기이고, 결국 서버 측의 성능에 그리 좋지 않은 영향을 미친다. 따라서 라운드 트립이 적게 일어나도록 제작되는 것이 바람직하다.)- 메세지를 기본적으로 파일 시스템에 저장하여 별도의 설정을 하지 않아도 오료 발생 시 오류 지점부터 복구가 가능하다.
(기존 메시징 시스템은 메시지를 메모리에 저장)- 메시지를 파일시스템에 저장하기 때문에 메시지가 많이 쌓여도 기존 메시징 시스템에 비해 성능이 크게 감소하지 않는다.
- window 단위의 데이터를 넣고 꺼낼 수 있다.
RabbitMQ는 AMQP 프로토콜을 구현해 놓은 프로그램으로써 빠르고 쉽게 구성할 수 있으며 직관적이다.
- 신뢰성, 안정성
- 유연한 라우팅
(Message Queue가 도착하기 전에 라우팅 되며 플러그인을 통해 더 복잡한 라우팅도 가능)- 클러스터링
(로컬네트워크에 있는 여러 RabbitMQ 서버를 논리적으로 클러스터링 할 수 있고 논리적인 브로커도 가능)- 관리 UI의 편리성
(관리자 페이지 및 모니터링 페이지가 제공됨)- 거의 모든 언어 및 운영체제를 지원
- 오픈소스로 상업적 지원 가능
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)을 사용한 웹 스트리밍 지원