AMQP란?
AMQP(Advanced Message Queing Protocol)는 메시지 지향 미들웨어를 위한 개방형 표준 응용 계층 프로토콜이다.
흔히 알고 있는 MQ의 오픈소스에 기반한 표준 프로토콜을 의미한다.
등장 배경
이전에도 상용화된 MQ 제품들은 많았지만, 한 가지 문제가 있다면 대부분 플랫폼 종속적인 제품들이었기 때문에 서로 다른 이기종간에 메시지를 교환하기 위해서는 메시지 포맷 컨버전을 위한 메시지 브리지를 이용하거나 (속도 저하 발생) 시스템 자체를 통일시켜야 하는 불편함과 비효율성이 있었다.
이러한 기존의 MQ들의 약점을 보완하기 위해 등장한것이 AMQP이다.
즉, AMQP의 목적은 서로 다른 시스템간에 최대한 효율적인 방법으로 메시지를 교환하기 위한 MQ 프로토콜인 것이다.
벤더에 종속되는 것을 방지하기 위해 AMQP는 대략 아래와 같은 조건을 충족한다.
- 모든 broker들은 똑같은 방식으로 동작할 것
- 모든 client들은 똑같은 방식으로 동작할 것
- 네트워크상으로 전송되는 명령어들의 표준화
- 프로그래밍 언어 중립적
AMQP Routing model
AMQP의 라우팅 모델은 아래와 같은 3개의 중요한 component 들로 구성된다.
- Exchange
- Publisher로부터 수신한 메시지를 적절한 큐 또는 다른 exchange로 분배하는 라우터의 기능을 한다.
- 각 큐나 exchange는 Binding을 사용해 exchange에 바인드 되어 있고, 따라서 exchange는 수신한 메시지를 이 binding에 따라 적당한 큐나 exchange로 라우팅 한다.
- Binding과 메시지를 매칭시키기 위한 라우팅 알고리즘을 정의한 것을 Exchange type이라고 하고, exchange type은 라우팅 알고리즘의 클래스이다.
- 브로커는 여러 개의 exchange type 인스턴스를 가질 수 있다.
- exchage type은 메시지를 어떤 방법으로 라우팅 시킬지를 결정하는 것이고, binding은 이러한 방법을 이용해 실제로 어떤 메시지를 어떤 큐에 보낼지를 결정하는 라우팅 테이블이라고 할 수 있다.
- Queue
- 메모리나 디스크에 메시지를 저장하고, 그것을 consumer에게 전달하는 역할을 한다.
- 큐는 스스로가 관심 있는 메시지 타입을 지정한 Binding을 통해 exchange에 말 그대로 bind 된다.
- Binding
- exchange와 큐와의 관계를 정의한 일종의 라우팅 테이블이다. 같은 큐가 여러 개의 exchange에 bind 될 수도 있고, 하나의 exchange에 여러개의 큐가 binding 될 수도 있다.
- Routing Key
- Publisher에서 송신한 메시지 헤더에 포함되는 것으로 일종의 가상 주소라고 보면 된다.
- Exchange는 이것을 이용해서 어떤 큐로 메시지를 라우팅 할지 결정할 수 있다.
- Standard Exchange Type
- 대부분의 MQ에서 가능한 여러 가지 상황에 대하여 AMQP에서 정의한 표준 라우팅 알고리즘이다.
Standard Exchange Type
Exchange Type은 메시지를 어떤 원칙 내지는 방법으로 라우팅 할지를 결정하는 일종의 알고리즘이다.
AMQP에서는 표준 Exchage Type으로 라우팅 키에 기반한 아래 3개의 라우팅 알고리즘과 key-value 헤더에 기반한 1개 유형의 Exchange Type들을 반드시 정의하도록 되어있다.
Direct Exchange
메시지의 라우팅 키를 큐에 1:N으로 매칭시키는 방법이다.
가장 일반적인 경우는 큐의 이름을 바인딩하고자 하는 라우팅 키와 동일하게 작성하는 방법이 있다.
위와 같은 경우 "sales_order"라는 라우팅 키를 갖는 메시지는 1번과 3번 큐로 전달된다.
Topic Exchange
와일드카드를 이용해서 메시지를 큐에 매칭시키는 방법이다.
라우팅 키는 "."으로 구분된 0개 이상 단어의 집합으로 간주되고, 와일드카드 문자들을 이용해서 특정 큐에 binding 한다.
"*"는 하나의 단어, "#"은 0개 이상의 단어를 의미한다. 즉 위와 같은 경우 해당 메시지는 1번 큐와 3번 큐로 라우팅 된다.
Fanout Exchange
모든 메시지를 모든 큐로 라우팅 하는 유형이다.
Headers Exchange
key-value로 정의된 헤더에 의해 라우팅을 결정한다.
큐를 바인딩할 때 x-match라는 특별한 argument로 헤더를 어떤 식으로 해석하고 바인딩할지를 결정하는데, x-match가 all이면 바인딩 조건을 모두 충족시켜야 한다는 것이고(AND), any이면 하나만 충족시키면 된다는 것이다.(OR)
위와 같은 경우 메시지는 1번과 3번 큐로 라우팅 된다.
참고 자료 :
https://ko.wikipedia.org/wiki/AMQP
http://egloos.zum.com/killins/v/3025514
'백엔드 > etc' 카테고리의 다른 글
[우아한 테크 세미나] 제어할 수 없는 것에 의존하지 않기 (1) | 2023.05.21 |
---|---|
Cross-Origin Resource Sharing (CORS) (0) | 2023.05.15 |
Blocking, Non-blocking, Sync, Async의 차이 (0) | 2023.05.13 |