Obsidian/Recognition/Programing/RabbitMQ(AMQP)/AMQP 개요.md

38 lines
4.0 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

Advanced Message Queing Protocol의 약자로, 흔히 알고 있는 MQ의 오픈소스에 기반한 표준 프로토콜을 의미한다. AMQP 자체는 프로토콜을 의미하기 때문에 이 프로토콜에 따른 실제 MQ 제품들은 여러가지가 존재할 수 있으나 최근 가장 많이 사용되는것은 아무래도 Erlang과 자바로 작성된 [RabbitMQ](https://www.rabbitmq.com/)라고 할 수 있다.
>  MQ (Message Queue) 란 메시지 기반의 미들웨어로 메시지를 이용하여 여러 어플리케이션, 시스템, 서비스들을 연결해주는 솔루션이다.
AMQP의 목적은 서로 다른 시스템간에 (비용/기술/시간적인 측면에서) 최대한 효율적인 방법으로 메시지를 교환하기 위한 MQ 프로토콜인 것이다.
- 모든 broker들은 똑같은 방식으로 동작할 것
- 모든 client들은 똑같은 방식으로 동작할 것
- 네트웍상으로 전송되는 명령어들의 표준화
- 프로그래밍 언어 중립적
#### AMQP Routing model
AMQP의 라우팅 모델은 아래와 같은 3개의 중요한 component 들로 구성된다.
- Exchange
Publisher로부터 수신한 메시지를 적절한 큐 또는 다른 exchange로 분배하는 라우터의 기능을 한다.
명함의 사람 이름 성씨를 보고 큐를 결정하겠다는 것은 exchange type이고, 김씨는 1번큐, 박씨는 2번큐, 이씨는 3번큐로 보내겠다는 것은 binding이다.
- Queue
일반적으로 알고있는 큐이다. 메모리나 디스크에 메시지를 저장하고, 그것을 consumer에게 전달하는 역할을 한다. 큐는 스스로가 관심있는 메시지 타입을 지정한 Binding을 통해 exchange에 말그대로 bind된다.
- Binding
exchange와 큐와의 관계를 정의한 일종의 라우팅 테이블이다. 같은 큐가 여러개의 exchange에 bind 될 수도 있고, 하나의 exchange에 여러개의 큐가 binding 될 수도 있다.
>AMQP는 이 3가지의 구성요소들이 서로간에 어떻게 통신하는지를 정의한 프로토콜이라고 볼 수 있다.
- Routing Key
Publisher에서 송신한 메시지 헤더에 포함되는 것으로 일종의 가상 주소라고 보면 된다. Exchange는 이것을 이용해서 어떤 큐로 메시지를 라우팅할지 결정할 수 있다. (이것을 사용하지 않고 다른 룰을 이용할 수도 있음) AMQP의 표준 exchange type은 이 라우팅 키를 이용하도록 되어있다.
- Standard Exchange Type
대부분의 MQ에서 가능한 여러가지 상황에 대하여 AMQP에서 정의한 표준 라우팅 알고리즘이다.
- Direct Exchange
![[Pasted image 20220616091049.png]]
메시지의 라우팅 키를 큐에 1:N으로 매칭시키는 방법이다. 가장 일바나적인 경우는 큐의 이름을 바인딩하고자 하는 라우팅 키와 동일하게 작성하는 방법이 있다.(물론 그렇게 하지 않아도 상관없다.) 위와 같은 경우 "sales_order"라는 라우팅 키를 갖는 메시지는 1번과 3번 큐로 전달된다.
- Topic Exchange
![[Pasted image 20220616091200.png]]
와일드카드를 이용해서 메시지를 큐에 매칭시키는 방법이다. 라우팅 키는 "."으로 구분된 0개 이상 단어의 집합으로 간주되고, 와일드카드 문자들을 이용해서 특정 큐에 binding한다. "\*"는 하나의 단어, "#"은 0개 이상의 단어를 의미한다. 즉 위와 같은 경우 해당 메시지는 1번 큐와 3번 큐로 라우팅 된다.
- Fanout Exchange
![[Pasted image 20220616091302.png]]
모든 메시지를 모든 큐로 라우팅하는 유형이다.
- Headers Exchange
![[Pasted image 20220616091327.png]]
key-value로 정의된 헤더에 의해 라우팅을 결정한다. 큐를 바인딩할 때 x-match라는 특별한 argument로 헤더를 어떤식으로 해석하고 바인딩할지를 결정하는데, x-match가 all이면 바인딩 조건을 모두 충족시켜야 한다는 것이고(AND), any이면 하나만 충족시키면 된다는 것이다.(OR) 위와 같은 경우 메시지는 1번과 3번 큐로 라우팅된다.