대규모 시스템에서 수배만 명의 사용자가 동시에 접속하고 상호작용할 수 있는 시스템을 구축해야 하는 상황에서 안정성과 신뢰성을 유지하면서 고성능을 제공해야 한다.
카톡이나 라인 같은 메시징 시스템을 개발한다고 했을 때, 사용자 수를 고려해서 초당 요청량을 생각해 보자, 시스템 모니터링을 통해 하루에 몇 명의 사용자가 접속하는지 알 수 있다. 그중에서 제일 높은 피크의 범위를 견딜 수 있게 애플리케이션을 개발해야 한다.
Queue를 통해서 대규모 스트림 처리를 할 수 있는데, 이번에는 RabbitMQ에 대해 학습해 보았다.
Queue : 선입선출(First In, First Out, FIFO) 구조를 따르는 선형 자료구조입니다. 먼저 들어간 데이터가 먼저 나오는 방식으로 동작하며, 일상생활에서 줄을 서는 느낌이라고 생각하면 될 것 같다.
RabbitMQ : 데이터(message)를 송신자(producer)로부터 수신자(consumer)에게 전달하는 중간 매개체 역할인 메시지 중개인이다. 이러한 message를 queue에 저장하고, 필요할 때 적절한 수신자에게 전달한다.
- 비동기 처리 : 데이터를 비동기적으로 처리하여 시스템의 응답성을 높인다.
- 부하 분산 : 여러 소비자에게 메시지를 분산시켜 시스템의 부하를 균형 있게 분산한다.
- 내결함성 : 메시지를 안전하게 저장하며 시스템 장애 시 데이터 손실을 방지한다.
1. Message : RabbitMQ를 통해 전달되는 데이터 단위이다. ex) 사용자 등록 정보, 주문 내역
2. Producer(Producer Service) : 메시지를 생성하고 RabbitMQ에 보내는 역할을 한다
3. Queue(Service1,2,3,4) : 메시지를 저장하는 장소
4. Consumer(Consumer Service1,2,3,4) : queue에서 메시지를 가져와 처리하는 역할 ex) 이메일 발송 서비스가 queue에서 사용자 등록 정보를 가져와 환영 이메일을 보내는 경우
5. Exchange(Default Exchange) : 메시지를 적절한 queue로 라우팅 하는 역할로 Producer는 message를 직접 queue로 보내지 않고 exchange에 보낸 뒤, exchange에서 message를 적절한 queue로 보낸다.
Exchage 유형 ▼
Direct Exchange
- 라우팅 키가 정확히 일치하는 큐로 메시지를 전달
- 예를 들어, 라우팅 키가 error인 메시지는 error라는 바인딩 키를 가진 큐로 전
Topic Exchange
- 라우팅 키의 패턴을 사용하여 메시지를 라우팅. 패턴에는 와일드카드 * (단어 하나)와 # (0개 이상의 단어)가 사용
- 예를 들어, 라우팅 키가 quick.orange.rabbit인 메시지는 바인딩 키가 *. orange.*인 큐로 전달.
Fanout Exchange
- 라우팅 키를 무시하고 교환기에 바인딩된 모든 큐로 메시지를 브로드캐스트
- 모든 바인딩된 큐로 메시지가 전달
Headers Exchange
- 라우팅 키 대신 메시지의 헤더를 기반으로 메시지를 라우팅
- 헤더 값과 바인딩된 헤더 값이 일치하는 큐로 메시지를 전달
docker를 사용해서 RabbitMQ를 간단하게 pull 할 수 있다.
docker run -d --name rabbitmq -p5672:5672 -p 15672:15672 --restart=unless-stopped rabbitmq:management
RabbitMQ를 다운로드하고 localhost:15672로 접속하면 로그인 창이 뜨게 되는데
id : guest
pw : guest
로 접속할 수 있다.
이제 다양한 작업을 통해 message를 확인해보자 🖐️🖐️
'🖥️ Back-end' 카테고리의 다른 글
웹 사이트의 동작 원리 (0) | 2025.03.11 |
---|---|
Jackson 이란? (1) | 2025.03.05 |
Redis 기본 문법 알아보기 (1) | 2025.03.03 |
인메모리 저장소와 Redis 란? - Redis Stack 설치 (0) | 2025.03.01 |
JPA의 N+1 문제란? (0) | 2025.02.21 |