본문 바로가기

AMQP/AMQP

[AMQP] AMQP의 이해

 

 

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