Java/Message Queue

[Java] Spring Boot AMQP RabbitMQ 이해하기 -1 : 구조 및 종류

adjh54 2023. 10. 14. 22:47
728x170

 
 
 

해당 글에서는 Spring Boot RabbitMQ에 대해 이해하고 활용하는 방법에 대해서 확인합니다.

 

 

💡 [참고] RabbitMQ에 대해 궁금하시면 아래의 글이 도움이 됩니다
분류 링크
Spring Boot AMQP RabbitMQ -1 : 구조 및 종류 이해하기 https://adjh54.tistory.com/284
Spring Boot AMQP RabbitMQ -2 : 로컬 환경 구성하기 https://adjh54.tistory.com/285
Spring Boot AMQP RabbitMQ -3 : Java 환경 구축 및 간단 예시 https://adjh54.tistory.com/292
Spring Boot AMQP RabbitMQ -4 : Exchange 종류 별 이해 및 사용예시 https://adjh54.tistory.com/497
Spring Boot AMQP RabbitMQ -5 : TTL 및 데드 레터링 사용예시 https://adjh54.tistory.com/501
Spring Boot AMQP RabbitMQ -6 : 메시지 큐 종류, 큐 우선순위 https://adjh54.tistory.com/518
Docker : Docker를 이용하여 RabbitMQ 구축하기 https://adjh54.tistory.com/496
Docker : Docker Compose를 이용하여 RabbitMQ Node Cluster 구축하기 https://adjh54.tistory.com/517
API Document : QueueBuilder API Document https://adjh54.tistory.com/505
API Document : ExchangeBuilder API Document https://adjh54.tistory.com/506
API Document : MessageProperties, MessagePropertiesBuilder, MessageBuilderSupport https://adjh54.tistory.com/508
Spring Boot AMQP RabbitMQ Github : Event Producer https://github.com/adjh54ir/blog-codes/tree/main/spring-boot-rabbitmq
Spring Boot AMQP RabbitMQ Github : Event Consumer https://github.com/adjh54ir/blog-codes/tree/main/spring-boot-rabbitmq-consumer

 

 
 

1) 분산 시스템(Distributed System)


💡 분산 시스템(Distributed System)

- ‘여러 대의 컴퓨터 또는 서버가 네트워크를 통해 연결되어 작업을 분산하고 처리하는 시스템’을 의미합니다.

- 분산시스템을 통해 작업을 효율적으로 분산시켜 성능, 가용성, 확장성 등을 향상할 수 있습니다.

 
 

1. 분산 시스템의 종류


💡 분산 시스템의 종류에 대해서 알아봅니다.
분산 시스템 종류 설명
클러스터링 - 여러 대의 ‘서버를 하나의 그룹으로 묶어서’ 단일 시스템처럼 동작하도록 합니다.
로드 밸런싱 - 여러 대의 ‘서버 사이에서 작업을 분산’시켜 부하를 균형있게 분산합니다.
클라우드 컴퓨팅 - 클라우드 환경에서 서비스를 제공하는 컴퓨팅 모델입니다.
- ‘리소스를 필요에 따라 확장하거나 축소’할 수 있어 유연성과 확장성이 뛰어납니다.
메시징 시스템 - 비동기 메시지 전송을 지원하여 ‘분산된 컴포넌트 간 통신’을 용이하게 합니다.
- 자바 애플리케이션 간의 비동기 통신에 유용합니다.
분산 데이터베이스 - 데이터를 ‘여러 대의 서버에 분산’하여 저장하고 처리하는 시스템입니다.
- 자바 애플리케이션은 분산된 데이터를 처리하는 데 사용될 수 있습니다.

 
 

2. 분산 메시징(Distributed Messaging)


💡 분산 메시징(Distributed Messaging)

- ‘여러 컴퓨터나 시스템 간에 데이터 및 메시지를 교환하고 통신하는 방법’을 의미합니다. 이는 여러 서버에 걸쳐 있는 애플리케이션들이 서로 데이터나 메시지를 주고받을 수 있도록 해줍니다

- 주요한 기능으로는 메시지 브로커와의 통합, 메시지 라우팅, 메시지 필터링, 메시지 변환 등의 기능이 있고 이를 처리하기 위해 메시징 솔루션으로 Apache Kafka, RabbitMQ, Amazon Kinesis 등이 있습니다.

 
 

3. 분산 메시징의 예시


💡 분산 메시징의 예시

- 배달 서비스를 개발할 때에 배달 서비스에서는 ‘주문이 완료된 상태’라고 가정을 합니다.

- 그렇다면 ‘고객’에게 주문 완료 메시지를 보내야 하고 ‘상점’에도 주문 완료 메시지를 보내야 하며, 또한 ‘서비스 메인 모듈’에도 메시지를 보내야 합니다.

- 이렇게 하나의 ‘주문이 완료된 상태’에 대해서 다양한 곳으로 메시지를 전송해야 하는 상태면 분산 메시징이 사용이 됩니다.

 
 
 

4. 분산 메시징의 특징


특징 설명
대규모 시스템 & 분산 환경 - 여러 시스템이 ‘동시에 메시지를 교환’하고 처리할 수 있으므로 메시지의 손실이나 중복 전송을 방지 할 수 있습니다.
비동기 통신 - 메시지는 비동기적으로 전송되어 ‘발신자와 수신자 간의 독립적인 작업’을 가능하게 합니다.
확장성 - 분산 메시징은 ‘수평적’으로 확장이 가능하여 대용량의 메시지 처리를 지원합니다.
유연성 - ‘다양한 메시징 패턴’과 ‘통신 프로토콜’을 사용하여 유연한 통신을 가능하게 합니다.
안정성 & 신뢰성 - 메시지 큐를 사용하여 메시지를 저장하고 처리하여 ‘메시지 손실이나 중복 전송을 방지’하여 신뢰성 있는 메시지 전달을 보장합니다.
상호 운용성 - 다른 시스템과의 상호 운용성을 제공하여 다양한 ‘플랫폼 간의 통신’을 지원합니다.

 

[ 더 알아보기 ]

💡 수평적 확장과 수직적 확장

- 수평적 확장 : 서버 수를 늘리는 것을 의미합니다. 데이터를 분산하여 저장하고 처리함으로써 시스템의 용량과 처리량을 확장할 수 있습니다.

- 수직적 확장 : 서버의 성능을 향상시키기 위해 하드웨어를 업그레이드하는 것을 의미합니다. 일반적으로 CPU, 메모리, 디스크 등의 하드웨어 요소를 더 강력한 것으로 교체하거나 추가하여 시스템의 성능을 개선하는 방법입니다.

 
 

5. 분산 메시징의 수평적 확장


💡 분산 메시징의 수평적 확장 방법

1. 파티션 분할

- 대량의 메시지를 처리하기 위해 메시지 큐를 여러 파티션으로 분할합니다. 각 파티션은 독립적으로 작동하며 메시지 처리 부하를 분산시킵니다.


2. 클러스터링

- 여러 메시지 브로커 인스턴스를 클러스터로 그룹화하여 메시지 처리를 병렬화하여 메시지 처리량을 확장할 수 있습니다.


3. 분산 큐
- 여러 개의 메시지 큐 인스턴스를 사용하여 메시지를 분산시킵니다. 이렇게 함으로써 메시지 처리 부하를 여러 서버로 분산시킬 수 있습니다.

 
 

2) AMQP(Advanced Message Queuing Protocol)


💡 AMQP(Advanced Message Queuing Protocol)

- ‘메시지 기반’의 통신을 위한 프로토콜을 의미합니다. 애플리케이션 간의 안정적이고 효율적인 데이터 전송을 위해 설계되었습니다.

- 다양한 플랫폼에서 사용되며 메시지를 비동기적으로 처리하고 분산 시스템에서 안정적으로 데이터를 전송하기 위해 사용됩니다.
- 주요한 기능으로는 신뢰성 있는 메시지 전달을 보장하며 메시지의 우선순위, 라우팅, 트랜잭션 등 다양한 기능을 제공합니다.

 
 

[ 더 알아보기 ]

💡 RabbitMQ과 AMQP는 무슨 관계인가?

- AMQL는 메시지 지향 미들웨어를 위한 개방형 표준 프로토콜을 의미하며 프로토콜을 사용할 수 있도록 제공하는 인터페이스가 됩니다.
- RabbitMQ는 AMQL 프로토콜을 따르는 메시지 브로커를 의미하며 프로토콜을 구현하는 구현체가 됩니다.

 

https://www.hadii.ca/insights/microservice-communication

 

💡 처리 과정

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. 풍부한 기능
- 다양한 기능을 제공합니다. 메시지 라우팅, 우선순위 설정, 토픽 기반 메시징 등을 활용하여 복잡한 메시징 시나리오를 구현할 수 있습니다. 

 
 
 

3. RabbitMQ 주요 용어


 

https://techblog.lotteon.com/msa-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-rmq-%EA%B5%AC%EC%A1%B0-%EA%B0%9C%EC%84%A0%ED%95%98%EA%B8%B0-1f273fc966df

용어 분류
메시지(Message) - 송신자와 수신자간에 전송이 되는 ‘데이터 덩어리’를 의미합니다.
메시지 브로커(Message Broker) - 메시지를 생성하고 소비하는 클라이언트 간에 메시지를 전달하는 미들웨어입니다.
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)’를 기반으로 메시지를 큐로 라우팅 합니다.
- 바인딩 키가 메시지의 라우팅 키와 정확히 일치하는 큐로 메시지가 라우팅 됩니다.

https://www.tutlane.com/tutorial/rabbitmq/rabbitmq-exchanges

 
 

1.2. Fanout Exchange

💡 Fanout Exchange

- ‘라우팅 키’에 관계없이 바인딩된 모든 큐로 메시지를 라우팅 합니다.
- 여러 소비자에게 메시지를 브로드캐스트 하는 데 유용합니다.

https://www.tutlane.com/tutorial/rabbitmq/rabbitmq-exchanges

 

1.3. Header Exchange

💡 Header Exchange

- 라우팅 키 대신 ‘헤더 속성 값’에 따라 메시지를 큐로 라우팅 합니다.
- 헤더 값은 소비자가 지정한 헤더와 일치해야 메시지가 라우팅이 됩니다.
- 헤더 정보를 기반으로 라우팅을 하기 때문에 라우팅 키나 패턴 매칭과는 다른 동작을 가집니다.

https://www.tutlane.com/tutorial/rabbitmq/rabbitmq-exchanges

 

1.4. Topic Exchange

💡 Topic Exchange

- 라우팅 키의 패턴 매칭에 따라 메시지를 큐로 라우팅 합니다.

- 라우팅 패턴 간의 와일드카드(*)가 일치해야만 수행합니다.

https://www.tutlane.com/tutorial/rabbitmq/rabbitmq-exchanges

 
 
 

2. Queue 속성


설정 옵션 설명
이름(Name) 애플리케이션에서 참조하는 데 사용할 수 있는 대기열의 이름이며 고유해야하며 시스템 정의 이름이 아니여야 합니다.
지속성(Durability) 큐가 RabbitMQ 서버 재시작 후에도 유지되는지 여부를 설정합니다.
TTL (Time-To-Live) 메시지가 큐에 얼마 동안 유지될 수 있는지를 설정합니다.
자동 삭제(Auto delete) 큐에 대기 중인 메시지가 없을 때 자동으로 큐를 삭제할지 여부를 설정합니다.
최대 용량(Max Length Bytes) 큐에 쌓일 수 있는 메시지의 최대 개수를 제한합니다.
우선순위(Maximum Priority) 큐에 들어온 메시지의 우선순위를 설정합니다.
 

RabbitMQ Queues - Tutlane

In rabbitmq, Queue is a buffer that stores a messages that are sent from the exchanges to queues. RabbitMQ Create Queue Now we will see how to create a queues in rabbitmq using web management portal. To create a queue in rabbitmq, open web management porta

www.tutlane.com

 

 

💡 [참고] Spring Boot AMQP RabbitMQ에 대해 더 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
구분 링크
Spring Boot AMQP RabbitMQ-1 : 구조 및 종류 https://adjh54.tistory.com/284
Spring Boot AMQP RabbitMQ-2 : 로컬환경 구성 https://adjh54.tistory.com/285
Spring Boot AMQP RabbitMQ-3: Java 구축 및 간단 예제 https://adjh54.tistory.com/292


 
 
 
 
오늘도 감사합니다. 😀
 
 
 

 
 

그리드형