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 프로토콜을 따르는 메시지 브로커를 의미하며 프로토콜을 구현하는 구현체가 됩니다.
💡 처리 과정
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 주요 용어
용어 | 분류 |
메시지(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)’를 기반으로 메시지를 큐로 라우팅 합니다.
- 바인딩 키가 메시지의 라우팅 키와 정확히 일치하는 큐로 메시지가 라우팅 됩니다.
1.2. Fanout Exchange
💡 Fanout Exchange
- ‘라우팅 키’에 관계없이 바인딩된 모든 큐로 메시지를 라우팅 합니다.
- 여러 소비자에게 메시지를 브로드캐스트 하는 데 유용합니다.
1.3. Header Exchange
💡 Header Exchange
- 라우팅 키 대신 ‘헤더 속성 값’에 따라 메시지를 큐로 라우팅 합니다.
- 헤더 값은 소비자가 지정한 헤더와 일치해야 메시지가 라우팅이 됩니다.
- 헤더 정보를 기반으로 라우팅을 하기 때문에 라우팅 키나 패턴 매칭과는 다른 동작을 가집니다.
1.4. Topic Exchange
💡 Topic Exchange
- 라우팅 키의 패턴 매칭에 따라 메시지를 큐로 라우팅 합니다.
- 라우팅 패턴 간의 와일드카드(*)가 일치해야만 수행합니다.
2. Queue 속성
설정 옵션 | 설명 |
이름(Name) | 애플리케이션에서 참조하는 데 사용할 수 있는 대기열의 이름이며 고유해야하며 시스템 정의 이름이 아니여야 합니다. |
지속성(Durability) | 큐가 RabbitMQ 서버 재시작 후에도 유지되는지 여부를 설정합니다. |
TTL (Time-To-Live) | 메시지가 큐에 얼마 동안 유지될 수 있는지를 설정합니다. |
자동 삭제(Auto delete) | 큐에 대기 중인 메시지가 없을 때 자동으로 큐를 삭제할지 여부를 설정합니다. |
최대 용량(Max Length Bytes) | 큐에 쌓일 수 있는 메시지의 최대 개수를 제한합니다. |
우선순위(Maximum Priority) | 큐에 들어온 메시지의 우선순위를 설정합니다. |
💡 [참고] 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 |
오늘도 감사합니다. 😀
그리드형
'Java > Message Queue' 카테고리의 다른 글
[Java] Spring Boot AMQP RabbitMQ 이해하기 -6 : 메시지 큐 종류, 큐 우선순위 (0) | 2024.06.29 |
---|---|
[Java] Spring Boot AMQP RabbitMQ 이해하기 -5 : TTL 및 데드 레터링 사용예시 (0) | 2024.06.05 |
[Java] Spring Boot AMQP RabbitMQ 이해하기 -4 : RabbitMQ Exchange 종류 별 이해 및 사용예시 (0) | 2024.05.30 |
[Java] Spring Boot AMQP RabbitMQ 이해하기 -3 : Java 구축 및 간단 예제 (0) | 2023.10.21 |
[Java] Spring Boot AMQP RabbitMQ 이해하기 -2 : 로컬 환경 구성 (2) | 2023.10.15 |