KS blog

killins.egloos.com

포토로그



AMQP Introduction by KillinS

1. AMQP란 무엇인가?

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



2. 등장배경

- 이전에도 상용화된 MQ 제품들은 많았지만, 한가지 문제가 있다면 대부분 플랫폼 종속적인 제품들이었기 때문에 서로 다른 이기종간에 메시지를 교환하기 위해서는 메시지 포멧 컨버전을 위한 메시지 브릿지를 이용하거나 (속도 저하 발생) 시스템 자체를 통일시켜야 하는 불편함과 비효율성이 있었다. (시스템을 교체하는 것은 논외로 치고 메시지 브릿지의 경우 MQ가 금융쪽에서도 많이 사용된다는걸 감안하면 속도 및 응답성의 저하는 치명적인 약점일 수 밖에 없다) 이러한 기존의 MQ들의 약점을 보완하기 위해 등장한것이 AMQP이다. 즉, AMQP의 목적은 서로 다른 시스템간에 (비용/기술/시간적인 측면에서) 최대한 효율적인 방법으로 메시지를 교환하기 위한 MQ 프로토콜인 것이다.
  벤더에 종속되는것을 방지하기 위해 AMQP는 대략 아래와 같은 조건을 충족한다. (용어에 대한 설명은 차후 진행)
  • 모든 broker들은 똑같은 방식으로 동작할 것
  • 모든 client들은 똑같은 방식으로 동작할 것
  • 네트웍상으로 전송되는 명령어들의 표준화
  • 프로그래밍 언어 중립적


3. AMQP Routing model

- AMQP의 라우팅 모델은 아래와 같은 3개의 중요한 component 들로 구성된다.
  • Exchange
  • Queue
  • Binding
  AMQP는 이 3가지의 구성요소들이 서로간에 어떻게 통신하는지를 정의한 프로토콜이라고 볼 수 있다. 전체적인 흐름은 아래와 같다.

- Exchange
  Publisher로부터 수신한 메시지를 적절한 큐 또는 다른 exchange로 분배하는 라우터의 기능을 한다. 각 큐나 exchange는 'Binding'을 사용해서 exchange에 바인드 되어 있고, 따라서 exchange는 수신한 메시지를 이 binding에 따라 적당한 큐나 exchange로 라우팅한다. Binding과 메시지를 매칭시키기 위한 라우팅 알고리즘을 정의한것을 Exchange type이라고 하고, exchange type은 라우팅 알고리즘의 클래스이다. 브로커는 여러개의 exchange type 인스턴스를 가질 수 있다. binding과 exchange type이 혼동될 수 있는데, exchange type은 메시지를 어떤 방법으로 라우팅 시킬지를 결정하는 것이고, binding을 이러한 방법을 이용해 실제로 어떤 메시지를 어떤 큐에 보낼지를 결정하는 라우팅 테이블이라고 할 수 있다. (아래 관련 항목 참조) 예를 들어 명함정보가 들어오면 그것을 특정 큐로 보내는 broker가 존재한다면, 명함의 사람 이름 성씨를 보고 큐를 결정하겠다는 것은 exchange type이고, 김씨는 1번큐, 박씨는 2번큐, 이씨는 3번큐로 보내겠다는 것은 binding이다.

- Queue
  일반적으로 알고있는 큐이다. 메모리나 디스크에 메시지를 저장하고, 그것을 consumer에게 전달하는 역할을 한다. 큐는 스스로가 관심있는 메시지 타입을 지정한 Binding을 통해 exchange에 말그대로 bind된다.

- Binding
  exchange와 큐와의 관계를 정의한 일종의 라우팅 테이블이다. 같은 큐가 여러개의 exchange에 bind 될 수도 있고, 하나의 exchange에 여러개의 큐가 binding 될 수도 있다.

- Routing Key
  Publisher에서 송신한 메시지 헤더에 포함되는 것으로 일종의 가상 주소라고 보면 된다. Exchange는 이것을 이용해서 어떤 큐로 메시지를 라우팅할지 결정할 수 있다. (이것을 사용하지 않고 다른 룰을 이용할 수도 있음) AMQP의 표준 exchange type은 이 라우팅 키를 이용하도록 되어있다.

- Standard Exchange Type
  대부분의 MQ에서 가능한 여러가지 상황에 대하여 AMQP에서 정의한 표준 라우팅 알고리즘이다. 아래 별도 항목을 참고.


4. Standard Exchange Type

Exchange Type은 메시지를 어떤 원칙 내지는 방법으로 라우팅할지를 결정하는 일종의 알고리즘이다. AMQP에서는 표준 Exchange 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번 큐로 라우팅된다.







핑백

  • KS blog : RabbitMQ with Python #3 2013-05-21 14:43:18 #

    ... ange type을 지원한다. 그 중 하나인 fanout을 이용해서 exchang를 생성하고, publish/subscribe 모델을 간단하게 작성해본다. (AMQP 관련 내용은 여기를 참고)예제로 작성할 pub/sub 모델은 로그이다. publisher가 로그 메시지를 브로커에 보내면, 브로커는 해당 메시지를 모든 subscrib ... more