사전지식
AMQP
AMQP(Advanced Message Queuing Protocol)는 메세지 지향 미들웨어에서 사용되는 오픈 표준 프로토콜로, 애플리케이션 간 메세지를 안정적이고 효율적으로 전송하기 위한 규칙이다. 주로 메세지 브로커와 클라이언트 간의 통신을 표준화하여, 메세지를 송수신하는 과정에서 다양한 시스템 간 호환성을 보장하는 것이 목적이다.
특징
- 플랫폼 독립성: AMQP는 표준화된 프로토콜로 서로 다른 언어나 플랫폼으로 개발된 애플리케이션이 AMQP를 통해 메세지를 교환할 수 있다. 즉, 다양한 언어로 개발된 시스템 간에도 호환된다!
- 확실한 메세지 전달 보장: 메세지가 손실 없이 목적지에 도달할 수 있도록 확실한 메세지 전달을 지원한다. 메세지가 성공적으로 전달되지 않으면 재전송할 수 있으며, Ack 메커니즘을 통해 메세지 처리 상태를 확인할 수 있다
- 메세지 큐잉 시스템: 메세지를 큐에 저장하여 프로듀서와 컨슈머가 독립적으로 동작할 수 있게 해준다. 즉, 프로듀서는 메세지를 보내고 즉시 종료할 수 있으며, 컨슈머는 큐에 있는 메세지를 필요할 때 가져와 처리할 수 있다.
- 라우팅과 메세지 패턴 지원: 단순한 점대점 메세지 전송뿐 아니라, 브로드 캐스팅, 라우팅 키 기반 메세지 전달 등 다양한 메세징 패턴을 지원한다. 이를 통해 여러 큐에 메세지를 라우팅하거나 특정 컨슈머에게만 메세지를 전달할 수 있다.
AMQP 구조의 주요 요소
- 메세지
- AMQP의 기본 단위로, 프로듀서가 생성한 데이터 패킷을 수신자에게 전달
- 메세지는 헤더와 바디로 나뉘며, 메세지 라우팅이나 처리 우선순위를 지정하는 다양한 메타데이터를 포함할 수 있다.
- 프로듀서
- 메세지를 생성하여 Exchange로 전송하는 주체
- 익스체인지
- 프로듀서로부터 받은 메세지를 라우팅 규칙에 따라 큐에 전달하는 역할
- 큐
- 메세지가 저장되는 공간
- 컨슈머
- 큐에 저장된 메세지를 수신하고 처리하는 주체
- 바인딩
- 익스체인지와 큐를 연결하는 규칙
Rabbit MQ란
RabbitMQ는 AMQP를 구현한 메세지 브로커이다.
RabbitMQ는 오픈소스 메세지 브로커로, 애플리케이션 간 메세지를 안전하고 효율적으로 전달하는 역할은 한다. 메세지 큐 방식으로 작동하여, 보낸 메세지를 큐에 저장하고, 수신 애플리케이션이 해당 메세지를 가져갈 수 있도록 한다.
핵심 개념
RabbitMq의 핵심 개념에 대해 알아보자.
- 프로듀서
- 큐
- 컨슈머
- 익스체인지
- 바인딩
- 메세지 확인
프로듀서
메세지를 생성하고 RabbitMQ에 보내주는 주체이다.
큐(Queue)
메세지가 임시로 저장되는 공간이며, 여러 수신자가 대기 중인 메세지를 가져갈 수 있다.
컨슈머(Consumer)
큐에서 메세지를 받아가는 애플리케이션이다.
익스체인지(Exchange)
프로듀서가 보낸 메세지를 큐로 라우팅하는 역할을 한다. 익스체인지 타입에 따라 메세지가 다른 큐로 전달된다. 타입은 Direct, Topic, Fanout, Headers가 있다.
Direct Exchange
라우팅 키를 기준으로 메세지를 특정 큐에 전달한다. 프로듀서가 메세지를 보낼 때 지정한 라우팅 키와 큐가 바인딩된 라우팅 키가 정확히 일치할 경우에만 메세지가 큐로 전달된다. 주로, 주문 처리를 위한 시스템에서 특정 상품 ID나 주문 ID에 따라 메세지를 전달할 때 사용된다.
Topic
라우팅 키에 와일드카드를 사용할 수 있어 보다 유연한 방식으로 메세지를 라우팅한다.
* 는 하나의 단어를 대체, #은 0개 이상의 단어를 대체한다.예를 들어, 로그 시스템에서 error.#로 설정하면 error.database, error.application 등과 일치하는 메세지를 모두 처리할 수 있다.
Fanout
라우팅 키를 사용하지 않고, 모든 바인딩된 큐에 메세지를 전달한다. 라우팅 로직 없이 메세지를 브로드 캐스팅하는 방식이다. 실시간 알림 시스템에서 여러 소비자에게 동일한 알림을 보내는 경우에 유용하다.
Headers
라우팅 키 대신 메세지의 헤더 속성에 따라 메세지를 큐로 전달한다. 헤더 값이 일치하는 큐에만 메세지가 전달된다.
바인딩(Binding)
바인딩은 익스체인지와 큐를 연결하는 규칙이다. 익스체인지가 메세지를 큐로 전달할 때 어떤 조건으로 큐에 메세지를 넣을지를 결정한다.
바인딩 키는 바인딩을 정의할 때 사용되는 값이다. Direct 및 Topic Exchange에서는 큐와 익스체인지를 연결할 때 이 키가 필수적으로 사용된다.
메세지 확인(Message Acknowledgment)
컨슈머가 메세지를 성공적으로 처리했음을 RabbitMQ에 알리면, 큐에서 해당 메세지가 삭제된다.
RabbitMQ의 장점
비동기 처리
요청과 응답을 비동기적으로 처리하여 애플리케이션의 부하를 줄일 수 있다.
확장성
여러 큐와 익스체인지를 통해 메세지를 효율적으로 라우팅할 수 있어 대규모 시스템에서도 유연하게 동작한다.
내결함성
메세지가 안전하게 전달되고, 장애 시에도 메세지를 잃지 않도록 지속성 기능을 제공한다.
어디에 사용될까?
RabbitMQ에 대해 찾아보면 작업 큐를 이용할 때나 MSA 서비스끼리 통신을 할 때에 주로 쓰이는 것 같다. 내 생각에는 티켓팅처리에도 레디스 분산락과 비슷한 느낌으로 쓰일 수 있을 것 같다. 그래서 다음 포스팅에는 스프링에서 RabbitMq를 사용해서 티켓팅을 간단하게 구현해봐야겠다.
'부트캠프 > Dev' 카테고리의 다른 글
최종 전.. 팀 프로젝트 시작 (1) | 2024.10.15 |
---|---|
스프링으로 RabbitMQ를 사용해보자 (1) | 2024.09.27 |
아웃 소싱 프로젝트 시작 (0) | 2024.09.22 |
뉴스피드 프로젝트 회고 (2) | 2024.09.06 |
뉴스피드 프로젝트 4일차 (1) | 2024.09.05 |