Amqp에 대하여
하나의 장비에 여러 서비스를 올릴 때 어떻게 서로 통신해야할까? 굳이 인터넷을 통해 외부로 빠져나갔다가 다시 네트워크에 들어와야할까?
AMQP란?
Advanced Message Queuing Protocol
- 메시지큐 기반의 통신 프로토콜인데 기존보다 더 좋은 것! 이다.
AMQP 특징
- 서로 다른 시스템들간 최대한 효율적인 방법으로 통신하기 위해 탄생하였다.
- 메시지 지향, 큐잉, 라우팅(p2p, publish-subscribe), 신뢰성, 보안을 기능으로 갖는다. +와이어 레벨 프로토콜이다. 바이트 스트림으로 네트워크를 경유하며 송신되는 데이터 형식을 말한다. 그래서 이런 데이터 형식을 따르며 메시지를 만들고 해석할 수 있는 도구라면 구현 언어와 관계 없이 다른 호환 도구와 상호 운용이 가능하다고 한다. (출처: 위키피디아 AMQP) -> 이전에도 상용화된 MQ 제품들이 있었으나 대부분 플랫폼 종속적이어서 이기종간 메시지 교환에 있어 효율이 떨어지고 불편함이 많았다. 이런 기존의 MQ들의 약점을 보완하기 위해 등장하였다. => AMQP의 목적은 서로 다른 시스템간의 효율적 메시지 교환이다.
AMQP의 조건
- 모든 broker들은 똑같은 방식으로 동작할 것
- 모든 client들은 똑같은 방식으로 동작할 것
- 네트워크상으로 전송되는 명령들의 표준화
- 프로그래밍 언어 중립적
AMQP의 Routing 구조
Exchange
- Publisher 로부터 받은 메시지를 적절한 큐 또는 다른 exchange로 분배하는 라우터 역할
- 각 큐나 exchange는 Binding을 통해 exchange에 바인딩돼있다.
- Exchange Type이라는 라우팅 알고리즘을 통해 Binding된 대로 메시지를 보낸다.
- exchange type: 메시지 라우팅 방법을 의미
- binding: exchange type을 통해 실제로 어떤 메시지를 어떤 큐에 보내야하는지 묶음이 정의된 라우팅 테이블
Queue
- 메모리나 디스크에 메시지를 저장한 뒤 consumer에 전달하는 역할
- exchange에 binding된다.
Binding
- exchange와 queue와의 관계를 정의한 일종의 라우팅 테이블이다.
- 큐와 exchange는 다대다 관계가 될 수 있다.
- one queue <- many exchange
- 여러 규칙에 의해 하나의 큐에 귀결될 수 있다.
- many queue -> one exchange
- 많은 큐들이 하나의 exchange로부터 라우팅 될 수 있다.
- one queue <- many exchange
Routing Key
- publisher가 보내는 메시지 헤더에 포함되는 가상 주소같은 것.
- exchange는 이걸 보고 메시지를 큐로 라우팅한다.
Standard Exchange Type
- 대부분의 MQ에서 가능한 여러 상황에 대해 AMQP에서 정의한 표준 라우팅 알고리즘이다.
Standard Exchange Type
- 메시지를 어떻게 라우팅할지 결정하는 알고리즘
- 라우팅 키에 기반 3개와 key-value 헤더에 기반한 1개이다.
- AMQP에서는 표준 Exchange Type으로 총 4개 유형의 Exchange Type을 정의하도록 되어있다.
Exchange Types 종류
Direct Exchange
- 메시지의 라우팅 키를 큐에 1:N으로 매칭하는 방법
Topic Exchange
- 메시지의 라우팅 키를 인식할 때 와일드카드를 이용해 동적으로 큐에 1:N으로 매칭하는 방법
- Direct와 비슷하지만 패턴 형태로 동적 매칭을 지원한다.
Fanout Exchange
- 모든 메시지를 모든 큐로 전송하는 유형
Headers Exchange
- Key-Value로 정의된 헤더에 의해 라우팅한다.
x-match=(all any) 를 통해 헤더 조건을 만족하는 정도를 결정한다. - all: 모두 만족해야한다.
- any: 하나만 맞아도 허용 -> 위 이미지에서는 Queue 1, 3
참고
- https://kaizen8501.tistory.com/217
- https://brightstarit.tistory.com/44
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.