DevOps/Middleware
메세지 큐(Message Queue)란?
peanutwalnut
2025. 3. 22. 14:26
메시지 큐(Message Queue)란 생산자(Producer)와 소비자(Consumer) 간에 비동기적으로 메시지를 주고받기 위해 사용하는 중간 저장소 혹은 소프트웨어 인프라를 말합니다. 애플리케이션들이 메시지를 즉시 주고받지 않고 큐에 쌓아두었다가, 소비자(Consumer)가 준비되었을 때 메시지를 가져갈 수 있도록 함으로써 비동기 처리, 확장성, 유연성을 높여줍니다.
1. 메시지 큐의 동작 방식
- 생산자(Producer)
- 메시지(데이터)를 생성하고, 메시지 큐에 이를 전송합니다(“push”).
- 메시지를 전송한 후에는 즉시 다음 작업을 수행할 수 있어, 생산자와 소비자가 동시에 연결되어 있지 않아도 됩니다.
- 메시지 큐(Message Queue)
- 메시지를 임시로 저장해두는 버퍼 혹은 저장소 역할을 합니다.
- 소비자가 메시지를 가져가기 전까지 메시지를 안전하게 보관하고, 여러 소비자 간에 메시지를 분배할 수도 있습니다.
- 소비자(Consumer)
- 큐에 들어온 메시지를 받아(“pull”) 처리하는 역할을 합니다.
- 메시지 처리를 완료하면, 메시지를 큐에서 제거(acknowledge)하여 중복 처리를 방지합니다.
- 동시 처리가 필요한 경우, 여러 소비자를 두어 병렬로 메시지를 소비할 수 있습니다.
2. 메시지 큐를 사용하는 이유
- 비동기 처리(Asynchronous Processing)
- 생산자와 소비자가 동시에 동작할 필요가 없으므로, 생산자는 메시지를 보낸 뒤 즉시 응답을 기다릴 필요 없이 다음 작업을 진행할 수 있습니다.
- 시스템 부하가 높은 시기에 메시지가 밀리더라도, 큐가 메시지를 안전하게 저장하여 소비자가 천천히 처리하도록 할 수 있습니다.
- 확장성(Scalability)
- 소비자를 여러 개 두어 메시지를 병렬로 처리하면, 부하가 늘어날 때 보다 쉽게 수평 확장을 할 수 있습니다.
- 메시지 큐가 메시지 분산을 관리하므로, 소비자들이 별도의 복잡한 로직 없이 확장 가능합니다.
- 유연성(Flexibility)
- 생산자와 소비자 간 결합도가 줄어들어, 한쪽이 잠시 다운되거나 지연되어도 전체 시스템이 즉시 중단되지 않습니다.
- 소비자는 메시지 처리 로직을 독립적으로 수정할 수 있으므로, 기능 개선이나 배포 전략이 좀 더 유연해집니다.
- 신뢰성(Reliability)
- 대부분의 메시지 큐는 **영속성(Persistence)**을 제공하여, 예상치 못한 장애 상황에서도 메시지를 잃지 않도록 합니다.
- ACK/NACK(재전송) 메커니즘을 통해 메시지가 손실 없이 적절히 전달되도록 보장합니다.
3. 메시지 큐의 주요 개념
- 영속성(Persistence)
- 메시지를 디스크 등에 저장하여 장애가 발생해도 메시지가 사라지지 않도록 합니다.
- 사용 여부는 애플리케이션 요구사항에 따라 설정할 수 있습니다.
- Ack(확인) / Nack(거부)
- 소비자가 메시지를 성공적으로 처리하면 큐에 “Ack” 신호를 보내 메시지를 제거합니다.
- 소비자가 처리에 실패한 경우 “Nack” 또는 타임아웃을 통해 다른 소비자에게 메시지를 재전송할 수 있습니다.
- Pub/Sub(발행/구독) 패턴
- 메시지 큐가 토픽(Topic) 개념을 두어, 여러 소비자가 같은 메시지를 받아볼 수 있게 하는 패턴입니다.
- 생산자가 특정 토픽에 메시지를 발행하면, 해당 토픽에 구독한 모든 소비자가 메시지를 받게 됩니다.
- Point-to-Point(1:1) 패턴
- 하나의 큐에 메시지를 넣으면, 한 소비자만 그 메시지를 가져가 처리하는 패턴입니다.
- 부하 분산(Load Balancing) 목적에 많이 사용됩니다.
4. 대표적인 메시지 큐 솔루션
- RabbitMQ
- 오랫동안 널리 사용되어 온 AMQP(Advanced Message Queuing Protocol) 기반 메시지 브로커.
- 라우팅 키, 익스체인지(Exchange) 등 다양한 메시징 패턴을 세밀하게 지원합니다.
- Apache Kafka
- 대규모 실시간 데이터 스트리밍 처리와 분산 Pub/Sub에 최적화된 플랫폼.
- 토픽 기반 구조, 파티션(Partition) 등으로 수평 확장성이 뛰어납니다.
- ActiveMQ
- JMS(Java Message Service) 표준 기반의 오픈소스 메시지 브로커.
- 기본 기능이 풍부하고, JMS를 필요로 하는 Java 생태계에서 많이 사용됩니다.
- Amazon SQS
- AWS에서 제공하는 완전관리형 메시지 큐 서비스.
- 클라우드 환경에서 인프라 관리 없이 메시지 큐 기능을 빠르게 활용할 수 있습니다.
5. 사용 시 주의사항
- 메시지 중복 처리 가능성
- 소비자가 Ack을 보내기 전 네트워크가 끊기면, 같은 메시지가 다시 전달될 수 있으므로 멱등성 처리가 중요합니다.
- 메시지 순서 보장
- 일부 메시지 큐(예: Kafka)는 파티션 단위로 순서를 보장하지만, RabbitMQ 등은 추가적인 작업이 필요할 수 있습니다.
- 적절한 모니터링 및 알람
- 큐에 메시지가 너무 많이 쌓이면(또는 갑자기 늘어나면) 병목이 될 수 있으므로, 모니터링과 알람 설정이 필수입니다.