1. PRODUCER → (Publish) → AMQP 클라이언트 : 메시지 생성 및 송신
- 생산자(PRODUCER)는 ‘메시지를 생성’하고 AMQP 클라이언트를 사용하여 ‘메시지를 전송’합니다.
2. Exchange : 메시지 라우팅
- Exchange에서는 AMQP 브로커를 통하여 메시지를 수신하고 라우팅 알고리즘을 사용하여 ‘메시지를 적절한 큐에 전달’합니다.
3. Queue : 메시지 저장
- Queue에서는 ‘메시지를 저장’하며 생산자와 소비자 간의 안정적인 ’비동기 통신‘을 처리하도록 돕습니다.
4. Queue → (Consume) → CONSUMER: 메시지 수신
- AMQP 프로토콜을 통해 ’메시지를 소비자(CONSUMER)에게 전달‘합니다.
-- 메시지가 소비자(CONSUMER)에게 전달이 되지 못하였을 경우 메시지 브로커에서 이를 보관합니다 : 메시지 보관
[ 더 알아보기 ]
💡 AMQP 클라이언트와 AMQP 브로커는 무슨 차이인가?
- AMQP 클라이언트는 AMQP 프로토콜을 사용하여 ‘메시지를 생성하고 송신’하는 역할을 수행합니다. - 생산자(PRODUCER)는 이를 이용하여 메시지를 생성하고 전송을 하는 데 사용합니다.
- AMQP 브로커는 AMQP 프로토콜을 사용하여 ‘메시지를 송수신하는 시스템 간의 중개자 역할(메시지 브로커)’을 수행합니다. - 메시지를 중재하고, 메시지를 수신하며, 메시지를 라우팅 하고, 메시지를 보관하는 등의 기능을 수행합니다.
3) RabbitMQ
💡 RabbitMQ - 오픈 소스 기반 메시지 브로커 소프트웨어로 분산 시스템에서 ‘메시지나 데이터’를 전달하기 위한 중간 매개체로 사용됩니다. - AMQP(Advanced Message Queuing Protocol)를 기반으로 하며 다양한 프로그래밍 언어와 플랫폼에서 사용할 수 있습니다. - 메시지 큐를 사용하여 메시지의 생산자와 소비자 사이에 '비동기적인 통신'함으로써 메시지는 큐에 저장되어 생산자와 소비자가 독립적으로 작동할 수 있습니다. 또한 RabbitMQ를 이용하여 메시지를 안전하게 전달하고 처리하는데 중점을 둡니다.
[ 더 알아보기 ]
💡 RabbitMQ의 메시지를 안정적으로 전달하고 처리하는 방법은?
1. 지속성 - RabbitMQ는 메시지를 '디스크에 저장'하여 지속성을 제공합니다. 이를 통해 메시지 유실을 방지할 수 있습니다.
2. 복제 - RabbitMQ는 여러 노드 간에 '메시지를 복제'하여 고가용성을 유지합니다. 이는 한 노드의 장애 시에도 메시지 유실을 방지할 수 있습니다.
3. 모니터링 - RabbitMQ의 상태를 지속적으로 '모니터링'하여 잠재적인 문제를 조기에 감지하고 대응할 수 있습니다.
1. RabbitMQ 분산 처리 과정
💡 RabbitMQ 분산 처리 과정 1. PRODUCER → BROKER(RabbitMQ) : 메시지 생성 및 송신
- 생산자(Producer)는 RabbitMQ에게 메시지를 보냅니다
2. BROKER(RabbitMQ) → EXCHANGS : 메시지 라우팅
- RabbitMQ에서는 메시지를 받아들이고 EXCHANGS를 통해서 라우팅 알고리즘을 사용하여 메시지를 적절한 큐에 전달합니다.
3. Binding : Exchange와 Queue의 연결
- Exchange와 Queue사이의 관계를 설정하여 연결을 할 때 어떻게 올바른 대상으로 전달이 될지(라우팅)에 대한 규칙을 정합니다.
4. Queue : 메시지 저장
- 바인딩된 Queue에서는 메시지를 저장하며 생산자와 소비자 간의 안정적인 비동기 통신을 처리하도록 돕습니다.
5. BROKER(RabbitMQ) → CONSUMER : 메시지 전송
- RabbitMQ는 큐에 있는 메시지를 소비자에게 전달합니다
6. CONSUMER → BROKER(RabbitMQ) : 완료 신호 전달
- 소비자는 메시지를 처리하고 완료되면 RabbitMQ에게 완료 신호를 보냅니다.
7. BROKER(RabbitMQ) → PRODUCER : 완료 응답
- 전송 완료에 대한 신호를 생산자에게 전달합니다.
8. BROKER(RabbitMQ) : 메시지 제거
- RabbitMQ는 완료된 메시지를 큐에서 제거합니다
2. RabbitMQ 주요 장점
💡 RabbitMQ 주요 장점
1. 유연성 - 다양한 메시징 패턴을 지원하며, 유연하게 구성할 수 있습니다. 이를 통해 다양한 애플리케이션 및 시스템 간의 통신을 쉽게 구현할 수 있습니다.
2. 확장성 - 분산형 메시지 큐 시스템으로서, 클러스터링을 통해 확장이 가능합니다. 이를 통해 메시지 처리량을 증가시키고, 고가용성을 보장할 수 있습니다.
3. 지속성 - 메시지를 디스크에 저장하여 안정적으로 보관할 수 있습니다. 이를 통해 메시지 유실을 방지하고, 안정적인 메시지 전달을 보장할 수 있습니다.
4. 다양한 프로토콜 지원 - AMQP(Advanced Message Queuing Protocol)를 비롯하여 다양한 프로토콜을 지원합니다. 이를 통해 다양한 플랫폼과 언어로 개발된 애플리케이션과 통신할 수 있습니다.
5. 풍부한 기능 - 다양한 기능을 제공합니다. 메시지 라우팅, 우선순위 설정, 토픽 기반 메시징 등을 활용하여 복잡한 메시징 시나리오를 구현할 수 있습니다.
- 메시지를 생성하고 소비하는 클라이언트 간에 메시지를 전달하는 미들웨어입니다. ex) Apache Kafka, RabbitMQ, Amazon Kinesis
교환기(Exchange)
- 메시지를 수신하고 처리할 대상을 결정하는 구성요소를 의미합니다. - 주로 메시지를 수신하고 라우팅 알고리즘을 통해 특정 큐로 보내는 역할을 수행합니다.
생산자(Producer)
- 메시지를 ‘생성’하고 메시지 브로커에 ‘전송’하는 구성요소를 의미합니다.
소비자(Consumer)
- 메시지 브로커에서 메시지를 가져와서 ‘수신’하고 ‘처리’를 하는 주체를 의미합니다.
바인딩(Binding)
- 클라이언트 애플리케이션과 메시징 시스템 간의 연결을 하는 과정을 의미합니다.
메시지 큐(Message Queue)
- 메시징 시스템에 저장된 메시지를 의미하며 송신자가 메시지를 전송하면 이를 수신자가 처리할때까지 대기시킵니다
4. RabbitMQ 데이터
💡 RabbitMQ에 저장하는 데이터
- 텍스트, JSON, XML, 바이너리 데이터 등을 담을 수 있습니다. 해당 메시지는 안전하게 저장하고 전달하는데 도움을 줍니다. - 메시지의 '우선순위'를 지정 할 수 있어 중요한 메시지에 우선순위를 부여할 수 있습니다. - 메시지를 '라우팅하고 필터링하는 기능'을 제공하여 메시지를 '특정 대기열로 전송'하거나 특정 소비자에게 전송할 수 있습니다.
💡 메시지 큐에 담을 데이터 예시
- 주문 정보 - 이벤트 알림 - 작업 요청 - 로그 데이터 - 센서 데이터 - 상태 업데이트 등
4) Spring Boot RabbitMQ 상세
1. Exchange 종류
💡 Exchange
- 프로듀서로부터 메시지를 받아들이고 바인딩 규칙에 따라 큐로 라우팅 하는 중요한 구성 요소입니다.
- 애플리케이션이 제공하는 라우팅 정보에 따라 Exchange에서 다양한 타입으로 라우팅을 수행이 가능합니다.
종류
설명
Direct Exchange
라우팅 키를 기반으로 메시지를 큐로 라우팅합니다.
Fanout Exchange
라우팅 키에 관계없이 바인딩된 모든 큐로 메시지를 라우팅합니다.
Headers Exchange
라우팅 키 대신 헤더 값에 따라 메시지를 큐로 라우팅합니다.
Topic Exchange
라우팅 키의 패턴 매칭에 따라 메시지를 큐로 라우팅합니다.
1.1. Direct Exchange
💡 Direct exchange - ‘라우팅 키(Routing Key)’를 기반으로 메시지를 큐로 라우팅 합니다. - 바인딩 키가 메시지의 라우팅 키와 정확히 일치하는 큐로 메시지가 라우팅 됩니다.
💡 Header Exchange - 라우팅 키 대신 ‘헤더 속성 값’에 따라 메시지를 큐로 라우팅 합니다. - 헤더 값은 소비자가 지정한 헤더와 일치해야 메시지가 라우팅이 됩니다. - 헤더 정보를 기반으로 라우팅을 하기 때문에 라우팅 키나 패턴 매칭과는 다른 동작을 가집니다.