메시지 큐란?
- 메시지 지향 미들 웨어(MOM)는 비동기 메시지를 사용하는 다른 응용프로그램의 데이터 송수신
- 메시지큐(MQ)는 프로그래밍에서 프로세스 또는 프로그램 인스턴스가 데이터를 서로 교환할 때 사용하는 방법
- 이 때 데이터를 교환 시 시스템이 관리하는 메시지 큐를 이용하는 것이 특징
- MOM은 MQ를 포괄하고 있고 MQ에는 Kafka, RabbitMQ, ActiveMQ 등
메시지 큐의 장점
- 비동기(Asynchronous) : Queue에 넣기 때문에 나중에 처리 할 수 있다.
- 비동조(Decoupling) : 애플리케이션과 분리 할 수 있다.
- 탄력성(Resilience) : 일부가 실패 시 전체에 영향을 받지 않는다.
- 과잉(Redundancy) : 실패 할 경우 재실행 가능
- 보증(Guarantees) : 작업이 처리된 걸 확인 할 수 있다.
- 확장성(Scalable) : 다수의 프로세스들이 큐에 메시지를 보낼 수 있다.
JMS va AMQP
- AMQP는 ISO 응용 계층의 MOM 표준이다.
- JMS는 MOM를 자바에서 지원하는 표준 API 이다.(JMS != AMQP)
- JMS는 다른 자바 애플리케이션들끼리 통신이 가능하지만 다른 MOM의 통신은 불가능하다.(AMQP, SMTP 등)
- ActiveMQ의 JMS 라이브러리를 사용한 자바 애플리케이션들 끼리 통신이 가능하다. 그러나 다른 자바 애플리케이션(ActiveMQ를 사용하지 않는)의 JMS와는 통신을 할 수 없다.
- AMQP는 프로토콜로 다른 AMQP를 사용한 애플리케이션끼리 통신이 가능하다 같은 라인인 SMTP 하고도 가능하다.
- JMS 라이브러리엔 AMQP를 지원하지 않는다.
Kafka va RabbitMQ vs ActiveMQ?
RabbitMQ , Kafka 및 ActiveMQ 는 모두 비동기 통신을 제공하고 프로세스를 분리하는 데 사용되는 메시징 기술입니다 (메시지의 발신자와 수신자 분리). 이를 메시지 대기열, 메시지 브로커 또는 메시징 도구라고합니다.
RabbitMQ, Kafka 및 ActiveMQ는 모두 동일한 기본 목적을 제공하지만 작업 방식이 다를 수 있습니다. Kafka는 처리량이 많은 분산 메시징 시스템입니다. RabbitMQ는 AMQP 기반의 신뢰할 수있는 메시지 브로커입니다. ActiveMQ와 Kafka는 모두 Apache 제품이며 둘 다 Java로 작성되었습니다. RabbitMQ는 Erlang으로 작성되었습니다.
- (공통) 3가지 전부 비통기 통신을 제공하고, 보낸 사람과 받는 사람을 분리한다.
- 하지만 업무에 따라서 다른 목적을 가지고 있다.
- Kafka(Apache)는 처리량이 많은 분산 메시징 시스템
- RabbitMQ, ActiveMQ(Apache)는 신뢰할 수 있는 메시지 브로커 이다.
- 물론 Kafka도 신뢰할 수 있음. 상대적으로 두개가 아직은 더 신뢰성이 높다라는 뜻
- RabbitMQ 는 바르고 쉽게 구성할 수 있으며 직관적이다.
- AMQT 프로토콜을 구현해놓은 프로그램, 신뢰성, 유연한 라우팅, 관리 UI의 편의성
- Kafka는 확장성, 고성능 및 높은 처리량
- 대용량 실시간 로그 처리에 특화, 단순한 메시지 헤더를 지닌 TCP 기반의 프로토콜 사용으로 오버헤드 감소
- 분산 시스템으로 인해 분산 및 복제 구성 장점
- 그리하여 노드 장애에 대한 대응성을 가지고 있음
- 프로듀서는 각 메시지를 배치로 broker에게 전달하여 TCP/IP 라운드 트립을 줄임
- 기본저긍로 파일시스템에 저장을 통해 영속성(혹은 수명)을 보장 = 오류시 오류 지점부터 복구가 가능
- Kafka, Kinesis(aws)는 window 단위의 데이터를 넣고 꺼낼 수 있다.
- ActiveMQ 는 효율적이고 사용하기 쉬운 오픈 소스
- 자바로 만든 오픈소스 메시지 브로커
- 다양한 언어와 프로토콜을 지원(Java, C, C++, C#, Ruby, Perl, Python, 그리고 PHP 클라이언트)
참고 블로그
'JAVA > 지식' 카테고리의 다른 글
[Spring Boot annotion] @Bean, @Configuration, @Component (0) | 2021.03.01 |
---|---|
Spring Boot Batch(read, process, write) #1 (0) | 2021.02.28 |
뮤텍스(Mutex)와 세마포어(Semaphore)의 차이 (0) | 2021.02.09 |
[AOP] AOP 정의, 용어정리, 활용방법 (0) | 2021.02.08 |
[JAVA] 열거형(enum) (0) | 2021.02.04 |