본문 바로가기
Back-End

메시지 큐(Message Queue) 정리

by 집돌이디벨로퍼 2024. 9. 18.

가까운 백엔드 개발자에게  종종 서버 과부하와 같은 문제는 어떻게 대처하냐고 물어보았는데 메시지 큐(Message Queue) 방식을 자주 활용한다고 했다. 메시지 큐는 비동기식으로 데이터를 프로세스나 프로그램 간에 전달할 수 있게 해주며, 시스템의 부하를 줄이고 안정성을 높이는 데 중요한 역할을 한다. 메시지 큐를 이해하기 위해서는 먼저 '큐(Queue)'의 개념을 알아둘 필요가 있다.

 

큐(Queue)

Queue란 컴퓨터의 기본 자료구조 중 하나로 먼저 들어온 데이터가 먼저 나가는 구조로 되어 있는 선입선출(FIFO, First In First Out) 구조 이다. 큐의 데이터가 추가되는 한쪽을 Rear 라고 하고 데이터가 삭제되는 한쪽을 Front 라고 한다. 이를 기반으로 메시지 큐는 처리해야 할 작업들을 큐에 쌓아두고, 서버가 준비될 때 하나씩 꺼내어 처리하는 방식으로 운영된다. 

 

 

사진 출처 : https://ko.wikipedia.org/wiki/%ED%81%90_(%EC%9E%90%EB%A3%8C_%EA%B5%AC%EC%A1%B0)

 

큐(Queue) 의 장점

 

비동기 처리 지원 : 비동기적으로 데이터를 처리할 수 있어 작업 요청을 처리하는 동안 시스템이 다른 작업을 계속해서 수행할 수 있다. 이는 특히 대량의 작업을 처리할 때 유용하다.

 

부하 분산 (Load Balancing) : 여러 컨슈머가 병렬로 데이터를 처리할 수 있어 시스템 부하를 효과적으로 분산할 수 있다. 프로듀서가 한 번에 여러 작업을 큐에 밀어 넣으면, 각 컨슈머가 나누어 처리하므로 전체 성능이 향상된다.

 

데이터 유실 방지 및 신뢰성 : 데이터가 순서대로 처리되고, 일단 큐에 들어간 데이터는 컨슈머가 처리할 때까지 안전하게 보관된다. 서버 장애나 네트워크 문제가 발생해도 큐에 저장된 메시지는 유실되지 않는다.

 

서비스간 결합도 감소 : 서로 독립된 시스템 간의 통신이 가능해진다. 큐는 시스템 간의 의존도를 낮춰주고 또한 마이크로서비스와 같은 분산 시스템에서 시스템 간 결합도를 줄이는 데 매우 유용하다.

 

확장성 : 데이터를 처리하는 컨슈머의 수를 유동적으로 늘릴 수 있어 수평적인 확장성을 쉽게 확보할 수 있다. 시스템 확장 시 큰 도움이 됩니다.


Message Queue

메세지 큐(Message Queue)  Queue 라는 자료구조를 채택해서 메세지를 전달하는 시스템이며, 메세지 지향 미들웨어(MOM) 을 구현한 시스템입니다.

 

여기서 메시지를 전달하려면 전달하는 부분과 메세지를 받는 부분이 필요할 것이다. 메세지의 발행과 전달하는 부분을 Producer, 메세지 소비 부분이 Consumer 이다. 메세지 큐(Message Queue)는 이 둘 사이를 전달해주는 매개체라고 생각하면 된다.

 

메시지 큐가 메시지를 운반하는 방식이 두가지가 있는데 하나는 메세지 브로커, 하나는 이벤트 브로커이다. 두 브로커는 각각 다른 개념이다.

 

메세지 브로커(Message Broker)

 

메시지 브로커는 Producer가 생성한 메시지를 일종의 '중간 저장소' 역할을 하는 메시지 큐에 보관하고, Consumer가 해당 메시지를 받아갈 수 있도록 한다.쉽게 말해, Producer가 만든 메시지는 브로커를 통해 메시지 큐에 '일시적으로' 저장되며, Consumer가 이를 가져가면 큐에서 자동으로 사라지게 된다.

 

비유해서 설명하자면 메시지 브로커는 물건을 잠시 맡아두는 택배 보관함과 비슷하다. Producer는 물건(메시지)을 보관함에 넣어두고, Consumer는 필요할 때 해당 물건을 찾아가는 것이다. 물건을 Consumer가 가져가면, 더 이상 보관함에 남아 있지 않게 된다. 이렇게 메시지 브로커는 Producer와 Consumer 간의 데이터를 중개하고, 메시지가 무한정 쌓이지 않도록 자동으로 관리해 준다.

 

이벤트 브로커(Event Broker)

이벤트 브로커는 메시지 브로커와 유사하게 데이터를 중계하는 역할을 할 수 있지만, 반대로 메시지 브로커는 이벤트 브로커의 기능을 모두 수행할 수 없다. 이벤트 브로커가 다루는 데이터는 '이벤트'라고 불리며, 메시지 큐처럼 한 번 소비된 데이터가 즉시 사라지지 않는다는 점에서 차별화된다. 즉, 이벤트 브로커는 Consumer가 데이터를 가져간 이후에도 필요하다면 동일한 데이터를 다시 사용할 수 있습니다.

 

즉, 메시지 브로커는 메시지를 '일회성 전달'하는 우편 시스템과 비슷하다면, 이벤트 브로커는 과거의 우편을 '기록 보관소'처럼 언제든지 다시 꺼내볼 수 있는 기능을 제공합니다. 이로 인해 이벤트 브로커는 훨씬 더 많은 양의 데이터를 관리하고 처리하는 데 유리하며, 반복적인 데이터 접근이 필요한 상황에 특히 적합합니다.

 

메시지 큐의 장점

1. 비동기(Asynchronous): Queue에 넣어두기 때문에 나중에 처리할 수 있다.
2. 낮은 결합도(Decoupling): 애플리케이션과 분리할 수 있다.
3. 탄력성(Resilience): 일부가 실패 시 전체에 영향을 받지 않는다.
4. 과잉(Redundancy): 실패 할 경우 재실행이 가능하다.
5. 신뢰성(Guarantees): 작업이 처리된 걸 확인할 수 있다.
6. 확장성(Scalable): 다수의 프로세스들이 큐에 메시지를 보낼 수 있다.

 

출처 : https://velog.io/@choidongkuen/%EC%84%9C%EB%B2%84-%EB%A9%94%EC%84%B8%EC%A7%80-%ED%81%90Message-Queue-%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90#3-kafka

 

[서버] 메세지 큐(Message Queue) 을 알아보자

안녕하세요 오늘은 메세지 큐(Message Queue) 에 대해 전반적인 이해와 대표적인 종류을 알아보겠습니다.메세지 큐 를 본격적으로 알아보기 전에 메세지 지향 미들웨어(MOM) 에 대해 알아보겠습니다.

velog.io

 

메세지 큐의 대표 예시

 

RabbitMQ

오픈 소스 메시지 브로커로 AMQP(Advanced Message Queuing Protocol)를 사용하여 메시지를 전달하는 시스템이다. 특히 신뢰성과 성능을 바탕으로 대규모 메시지 처리에 적합하다.

 

특징

  • 메시지 라우팅: 다양한 방식으로 메시지를 라우팅할 수 있으며, 팬아웃(fan-out), 토픽(topic), 라우팅 키를 통해 메시지를 다양한 소비자에게 전달할 수 있다.
  • 내결함성: 메시지를 디스크에 저장해 두기 때문에 시스템 장애가 발생해도 메시지가 유실되지 않는다.
  • 플러그인 시스템: 인증 및 통계 기능을 제공하는 플러그인을 지원하여 확장이 가능하다.

사용 사례

  • 대규모 분산 시스템에서의 작업 분배
  • 여러 소비자(Consumer)에게 동일한 메시지 전달
  • 실시간 데이터 처리 및 스트리밍 서비스

Apache Kafka

분산형 이벤트 스트리밍 플랫폼으로 대용량 데이터를 실시간으로 처리하고 스트리밍하는 데 최적화되어 있다. Apache Kafka는 대규모 분산 시스템에서 주로 사용되며, 메시지 큐와 이벤트 브로커 역할을 모두 수행할 수 있다.

 

특징

  • 확장성: 파티션(partition) 구조를 통해 수평 확장이 용이하고, 수천 대의 서버와 수백만 개의 메시지를 처리할 수 있다.
  • 내구성: 메시지를 디스크에 기록하여 데이터 유실을 방지하고, 복제 기능을 통해 내결함성을 제공한다.
  • 이벤트 재처리: 메시지 큐에서 이미 소비한 데이터를 다시 읽어올 수 있어 이벤트 재처리가 가능하며, 데이터 분석이나 백필(Backfill)에 적합하다.

 

사용 사례

  • 로그 및 메트릭 수집 및 분석
  • 실시간 데이터 분석 및 처리 (예: 추천 시스템, 실시간 이벤트 트래킹)
  • 마이크로서비스 간의 비동기 통신 및 데이터 스트리밍

정리

메시지 큐는 비동기 처리, 낮은 결합도, 탄력성, 과잉 처리, 신뢰성, 그리고 확장성을 제공하여 시스템의 안정성과 성능을 크게 향상시키는 중요한 기술이다. 이를 통해 서버부하를 효과적으로 관리하고, 장애가 발생하더라도 데이터를 안전하게 보관하고 처리할 수 있다.

 

특히, 대규모 분산 시스템에서 메시지 큐는 각 구성 요소 간의 의존성을 최소화하고, 여러 프로세스가 병렬로 데이터를 처리할 수 있게 하여 확장성을 극대화합니다. 이러한 장점 덕분에 메시지 큐는 현대의 많은 애플리케이션에서 핵심적인 역할을 한다.

 

공부하면서 알게되었는데 메세지 큐는 마이크로서비스(MSA) 아키텍처와 같이 독립적인 서비스들 간의 통신과 데이터를 안정적으로 관리하는 데 필수적인 기술로 자리 잡고 있다고 한다. 다음 시간엔 MSA가 뭔지 정리해보려고한다

 

'Back-End' 카테고리의 다른 글

[AWS Ubuntu] 읽기 전용 파일 내용 바꾸기  (0) 2024.09.04
AWS 클라우드 개념 공부  (2) 2024.09.01
[Back-End] JVM 메모리 공부  (1) 2024.06.30
[Back-End] JPA 개념정리  (0) 2024.06.07
[JPA] TEST코드 수정  (0) 2024.06.07