MQ
AMQP 프로토콜
김 정출
2024. 10. 20. 19:15
AMQP 프로토콜
- AMQP(Advanced Message Queuing Protocol)는 메시지 지향 미들웨어를 위한 오픈 표준 프로토콜입니다.
- 주로 대규모 메시징 시스템에서 메시지를 송수신하기 위한 프로토콜로, 클라이언트와 메시지 브로커 간의 통신을 효율적으로 처리하는 역할을 합니다.
- AMQP는 다양한 메시징 패턴과 신뢰성, 보안을 제공하며, 메시지 기반의 분산 시스템에서 많이 사용됩니다.
AMQP의 주요 특징
- 플랫폼 독립성: AMQP는 프로토콜이므로 특정 언어나 운영체제에 종속되지 않습니다. 다양한 언어와 플랫폼에서 동일한 프로토콜을 사용할 수 있습니다.
- 메시지 라우팅: AMQP는 교환기(Exchange)와 큐(Queue)를 사용하여 메시지를 다양한 방식으로 라우팅할 수 있습니다. 이로 인해 Publish/Subscribe 패턴, Point-to-Point 패턴 등 다양한 메시징 패턴을 구현할 수 있습니다.
- 확실한 메시지 전달: 메시지의 손실을 방지하기 위해 메시지 전달 보장(예: "At Least Once", "Exactly Once" 전달 보장)을 지원합니다. 또한, 메시지 순서 보장 및 트랜잭션 처리를 통해 안정적인 메시징이 가능합니다.
- 유연한 라우팅: AMQP는 Exchange를 통해 여러 가지 라우팅 방식(Direct, Topic, Fanout 등)을 제공하여, 복잡한 메시지 라우팅 요구사항을 처리할 수 있습니다.
- 보안 및 인증: SSL/TLS를 사용한 보안 및 사용자 인증을 지원하여 안전한 메시징을 가능하게 합니다.
AMQP의 주요 구성 요소
- 교환기(Exchange): 메시지를 수신하고 이를 라우팅 규칙에 따라 적절한 큐에 전달하는 역할을 합니다. Direct, Fanout, Topic, Headers 등의 여러 종류가 있습니다.
- 큐(Queue): 메시지를 저장하는 버퍼 역할을 하며, 소비자(Consumer)가 메시지를 읽을 때까지 대기합니다.
- 바인딩(Binding): 교환기와 큐를 연결하여 라우팅 규칙을 정의하는 설정입니다.
- 메시지(Message): 전달되는 데이터의 기본 단위로, 헤더 및 본문으로 구성됩니다.
Exchange & Binding
AMQP는 여러 종류의 Exchange를 제공합니다. 각 Exchange는 메시지를 라우팅하는 방식이 다르며, 주요 Exchange 타입은 다음과 같습니다:
- Direct Exchange:
- 라우팅 키를 사용하여 메시지를 특정 큐에 정확하게 매핑하는 Exchange입니다. 프로듀서가 메시지를 보낼 때 특정 라우팅 키를 지정하면, 이 키와 일치하는 큐로 메시지가 전달됩니다.
- 예를 들어, 라우팅 키가 "error"인 메시지를 보내면, "error"라는 라우팅 키를 가진 큐에 메시지가 전달됩니다.
- Fanout Exchange:
- 라우팅 키와 상관없이 Exchange에 연결된 모든 큐로 메시지를 브로드캐스트하는 방식입니다. 즉, Exchange와 바인딩된 모든 큐로 동일한 메시지가 전달됩니다.
- 이 Exchange는 로그 브로드캐스트, 알림 시스템 등에 유용합니다.
- Topic Exchange:
- 라우팅 키의 패턴에 따라 메시지를 라우팅하는 Exchange입니다. 라우팅 키는 점(".")으로 구분된 여러 단어로 이루어지며, 바인딩 시 와일드카드(‘*’, ‘#’)를 사용할 수 있습니다.
- 예를 들어, “user.*”라는 패턴을 사용하면, “user.create”, “user.delete” 등의 메시지가 모두 해당 큐로 전달될 수 있습니다. 와일드카드 ``는 한 단어를 대체하고, #는 여러 단어를 대체합니다.
- Headers Exchange:
- 메시지의 헤더 정보를 기반으로 메시지를 라우팅하는 Exchange입니다. 라우팅 키를 사용하지 않고, 메시지의 헤더 속성과 바인딩된 큐의 헤더 조건이 일치할 때 큐로 전달됩니다.
- 복잡한 조건을 설정하여 특정 헤더를 가진 메시지만 큐에 전달하도록 할 수 있습니다.
Exchange의 동작 과정
- 프로듀서는 특정 Exchange에 메시지를 전달합니다.
- Exchange는 메시지의 라우팅 키와 바인딩 정보를 확인합니다.
- 바인딩 조건에 맞는 큐를 찾고, 해당 큐로 메시지를 전달합니다.
Exchange와 Queue의 바인딩
- Exchange와 큐는 **바인딩(Binding)**을 통해 연결됩니다. 바인딩은 라우팅 규칙을 정의하며, 특정 Exchange와 특정 큐를 라우팅 키나 조건에 따라 연결하는 설정입니다.
- 예를 들어, Direct Exchange에서 "error" 라우팅 키를 가진 큐와 바인딩을 하면, Exchange로 들어온 라우팅 키가 "error"인 메시지는 해당 큐로 전달됩니다.
사용 사례
AMQP는 RabbitMQ와 같은 메시지 브로커에서 자주 사용됩니다. 특히 다음과 같은 경우에 유용합니다:
- 분산 시스템에서의 데이터 및 이벤트 전송
- 대규모 데이터 처리 및 스트리밍
- 마이크로서비스 아키텍처에서의 비동기 통신
AMQP는 메시지 기반 아키텍처를 구축하고자 할 때 널리 사용되며, 안정적인 메시징을 보장하는 시스템을 만들 때 강력한 도구입니다.
AMQP 프로토콜 구조
- AMQP(Advanced Message Queuing Protocol)는 표준화된 프로토콜로, 메시징 시스템에서 클라이언트와 브로커 간의 통신을 정의하는 규격입니다.
- AMQP는 전송, 메시지 형식, 트랜잭션 및 세션을 관리하기 위한 다양한 규칙을 제공합니다. RabbitMQ와 같은 메시지 브로커 소프트웨어에서 AMQP를 구현하며, 네트워크를 통해 다양한 클라이언트와 브로커 간의 메시지 송수신을 가능하게 합니다.
1. AMQP의 구조
AMQP는 주로 다음과 같은 4가지 계층으로 구성됩니다:
- 프레임 계층(Frame Layer): 네트워크에서 교환되는 개별 패킷의 전송을 담당합니다.
- 전송 계층(Transport Layer): 연결과 흐름 제어를 관리하며, 안정적인 데이터 전송을 보장합니다.
- 세션 계층(Session Layer): 여러 개의 논리적인 세션을 연결 위에서 관리하며, 각 세션마다 독립적인 흐름 제어를 할 수 있게 합니다.
- 애플리케이션 계층(Application Layer): 메시지 큐, 교환기, 바인딩 등 메시징의 주요 개념을 관리하고 정의합니다.
2. AMQP 프로토콜의 프레임
AMQP는 프레임(Frame) 기반의 프로토콜입니다. 프레임은 AMQP의 데이터 전송 단위이며, 각 프레임에는 특정 작업에 대한 명령 또는 데이터가 포함됩니다. 주로 다음과 같은 프레임이 있습니다:
- 메서드 프레임(Method Frame): Exchange 생성, 큐 선언, 메시지 퍼블리싱 등의 AMQP 명령을 표현합니다.
- 헤더 프레임(Header Frame): 메시지의 속성(메타데이터) 정보를 포함합니다.
- 바디 프레임(Body Frame): 메시지의 실제 데이터(payload)를 포함합니다.
- Heartbeat 프레임: 클라이언트와 서버 간의 연결 상태를 유지하기 위해 주기적으로 전송됩니다.
3. AMQP의 통신 규격
AMQP의 통신 규격은 클라이언트와 메시지 브로커 간의 상호작용을 상세하게 정의합니다. 주요 통신 흐름은 다음과 같습니다:
- 연결 및 채널 생성:
- 클라이언트가 메시지 브로커에 연결을 요청합니다. 연결이 수립되면 여러 개의 채널(Channel)을 생성할 수 있습니다. 채널은 논리적인 통신 라인으로, 하나의 연결 위에 여러 채널을 개설할 수 있습니다.
- 연결 수립 후, 클라이언트는 특정 채널을 통해 Exchange 또는 큐를 선언할 수 있습니다.
- Exchange 및 큐 선언:
- 클라이언트는 Exchange를 선언하고, 메시지를 보낼 교환기를 설정합니다. Exchange는 메시지를 적절한 큐로 라우팅하기 위한 규칙을 정의합니다.
- 클라이언트는 큐를 선언하고, Exchange와 큐 사이의 바인딩 규칙을 설정합니다.
- 메시지 전송:
- 클라이언트(프로듀서)는 특정 Exchange에 메시지를 전송합니다. 이때, 메시지에는 라우팅 키가 포함될 수 있으며, Exchange는 라우팅 규칙에 따라 큐에 메시지를 전달합니다.
- 메시지는 메서드 프레임, 헤더 프레임, 바디 프레임으로 분리되어 전송됩니다.
- 메시지 소비:
- 컨슈머(Consumer)는 특정 큐에서 메시지를 소비합니다. 메시지가 큐에서 컨슈머로 전달되면, 컨슈머는 메시지에 대한 확인 응답을 보냅니다.
- AMQP는 메시지 전달 보장 방식을 지원하기 때문에, 메시지 소비가 완료되면 컨슈머는 브로커에 ACK 또는 NACK 응답을 보내 메시지 처리 상태를 알립니다.
- 트랜잭션 관리:
- AMQP는 트랜잭션 모드를 지원하여 메시지를 보내고 받을 때 원자성을 보장할 수 있습니다. 트랜잭션은 커밋 또는 롤백될 수 있으며, 이를 통해 메시지의 안정적인 처리를 할 수 있습니다.
4. AMQP의 통신 포트
AMQP의 기본 포트는 TCP 5672이며, TLS를 사용하는 경우 TCP 5671 포트를 사용합니다. 클라이언트와 브로커 간의 통신은 이러한 포트를 통해 이루어집니다.
요약
AMQP는 클라이언트와 브로커 간의 통신을 표준화하여 안정적이고 유연한 메시징을 가능하게 하는 프로토콜입니다. 네트워크 통신의 기본 단위로 프레임을 사용하며, 메시지 전송, 큐 관리, 트랜잭션 처리 등을 지원하여 다양한 메시징 요구를 충족시킵니다.