AMQP를 이해하기 전에 먼저 MQ가 무엇인지 부터 알아야 한다.
1. MQ 란?
MQ(Message Queue) 란
메시지 기반의 미들웨어로 메시지를 이용하여 여러 애플리케이션, 시스템, 서비스들을 연결해주는 솔루션이다.
즉, 프로세스 또는 프로그램 인스턴스가 데이터를 서로 교환할 때 사용하는 통신 방법이다.
더 큰 개념으로는 메시지 지향 미들웨어(Message Oriented Middleware: MOM)를 구현한 시스템을 의미한다.
MOM은 비동기 메시지를 사용하는 응용 프로그램 간의 데이터 송수신을 말한다.
2. AMQP
그러면 AMQP는 무엇일까 ?
인스턴스가 데이터를 서로 교환할 때 사용하는 방법이다.
MQ를 오픈 소스에 기밚나 표준 프로토콜이 AMQP 이며 이 자체가 프로토콜을 의미하고 있다.
3. AMQP 특징
- 모든 broker들은 똑같은 방식으로 동작할 것
- 모든 client들은 같은 방식으로 동작할 것
- 네트워크상으로 전소오디는 명령어들의 표준화
- 프로그래밍 언어 중립적
4. AMQP Rounting Model
- component 구성
- Exchange
- Queue
- Binding
Exchange : 메세지 브로커에서 큐에 메세지를 전달하는 역할을 한다.
Queue : 메모리나 디스크에 메세지를 저장하고, 그것을 consumer에게 전달하는 역할을 한다.
스스로 관심있는 메시지 타입을 지정한 Binding을 통해 Exchange에 말드개로 bind된다.
Binding : Exchange에 전달된 메세지가 어떤 큐에 저장되어야 하는지 정의
5. Standard Exchange Type
- Direct Exchange
- 메세지의 라우팅 키를 큐에 1:1으로 매칭 시키는 방법
- 라운드 로빈 방식으로 여러 Consumer간 task 분리
- Topic Exchange
- 와일드카드를 이용해서 메세지를 큐에 매칭시키는 방법
- MultiCast 방식에 적합
- 라우팅 키는 ","으로 구분된 0개 이상의 단어의 집합으로 간주 되고 와일드카드 문자들을 이용해 특정 큐에 바인딩
- '*' : 하나의 단어
- '#' : 0개 이상의 단어
- Fanout Exchange
- 모든 메세지를 모든 큐로 라우팅 하는 유형
- 1:N 방식으로 메세지를 브로드캐스트 하는 용도로 사용
- Headers Exchange
- key-value로 정의된 헤더에 의해 라우팅을 결정
- 큐를 바인딩 할때 x-match라는 특별한 argument로 헤더를 어떤식으로 해석하고 바인딩 할지를 결정
- all : 모두 충족 시켜야 함 (and)
- any : 하나만 충족시키면 된다. (OR)
6. AMQP의 사용
RabbitMQ
- 신뢰성 , 안정성
- 유연한 라우팅 (Message Queue가 도착하기 전에 라우팅 되며 플러그인을 이용해서 더 복잡한 라우팅 가능)
- 클러스터링 (로컬네트워크에 있는 여러 RabbitMQ 서버를 논리적으로 클러스터링 할수 있음)
- 관리 UI의 편리성 (관리자 페이지 및 모니터링 페이지 제공)
- 거의 모든 언어 및 운영체제 지원
- 오픈소스로서 상업적 지원 가능
ActiveMQ
- 다양한 언어와 프로토콜 지원 (JAVA, C, C++, C#, Ruby, Peri, Python, PHP 클라이언트)
- OpenWire을 통해 고성능의 JAV, C, C++, C# 클라이언트 지원
- Stomp를 통해 C, Ruby, Peri, Python,PHP 클라이언트가 다른 인기 있는 메세지 브로커들과 마찬가지로 ActiveMQ에 접근 가능
- Message Groups, Virtual Destinations, Wildcards와 Composite Destination을 지원
- Spring 지원으로 ActiveMQ는 Spring Application에 매우 쉽게 임베딩될 수 있으며, Spring의 XML 설정 메커니즘에 의해 쉽게 설정 가능
- Geronimo, JBoss 4, GlassFish, WebLogic과 같은 인기있는 J2EE 서버들과 함께 테스트됨
- 고성능의 저널을 사용할 때에 JDBC를 사용하여 매우 빠른 Persistence를 지원
- REST API를 통해 웹기반 메시징 API를 지원
ZeroMQ
- 분산/동시성 애플리케이션에 사용되도록 개발됨
- 라이브러리의 API는 버클릿 소켓의 API 설계와 유사
- 메세지 지향 미들웨어와 달리 메세지 브로커 없이 동작 가능 (크로스 플랫폼으로 동작 가능)
- 뛰어난 확장성
- 훌륭한 퍼포먼스
- 단순함
- 패턴
- Request-Reply : 클라이언트와 서비스의 집합을 연결하는 패턴
- Publish-subscribe : publisher와 subscriber 집합을 연결하는 패턴
- Pipeline : Push/Pull 소켓 쌍으로 단방향 통신에 이용하는 패턴
Apache Kafka
- 대용량 실시간 로그 처리에 특화되어 있다.
- AMQP 프로토콜이나 JSM API를 사용하지 않고 단순한 메세지 헤더를 지닌 TCP 기반 프로토콜을 사용하므로서 오버헤드가 비교적 작다.
- 노드 장애에 대한 대응성을 가지고 있다.
- 프로듀서는 각 메세지를 배치로 브로커에 전달하며 TCP/IP 라운드 트립을 줄였다.
- 메세지를 기본적으로 파일 시스템에 저장하여 별도의 설정을 하지 않아도 오류 발생시 오류 지점부터 복구가 가능 (기존 메세징 시스템은 메시지를 메모리에 저장)
- 메시지를 파일 시스템에 저장하기 떄문에 메세지가 많이 쌓여도 기존 메세징 시스템에 비해 성능이 크게 감소하지 않는다.
- window 단위의 데이터를 넣고 꺼낼수 있다.
! 참고
https://blog.naver.com/dktmrorl/222117711303
https://velog.io/@gjrjr4545/AMQP