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

4.0 KiB

Advanced Message Queing Protocol의 약자로, 흔히 알고 있는 MQ의 오픈소스에 기반한 표준 프로토콜을 의미한다. AMQP 자체는 프로토콜을 의미하기 때문에 이 프로토콜에 따른 실제 MQ 제품들은 여러가지가 존재할 수 있으나 최근 가장 많이 사용되는것은 아무래도 Erlang과 자바로 작성된 RabbitMQ라고 할 수 있다.

 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번 큐로 라우팅된다.