메세지 큐

Architecture

Posted by Yan on July 20, 2024

메세지 큐란?

  • 메세지 큐(Message Queue)는 소프트웨어 시스템에서 데이터를 비동기적으로 교환하기 위해 사용하는 통신 방법 중 하나이다.
  • 생산자(producer)가 보낸 메세지를 일시적으로 저장하고, 소비자(consumer)가 필요할 때 그 메세지를 가져가 처리할 수 있도록 돕는다. 이를 통해 두 시스템 간에 데이터 전송이 이루어지며, 이러한 통신은 서로 직접 연결되지 않고 메세지 큐를 통해 간접적으로 이루어진다.
  • 간단히 말해, producer는 메세지를 큐에 보내고, consumer 큐에서 메세지를 꺼내어 쓴다.
  • 대표적인 메세지 큐 시스템으로는 RabbitMQ, Apache Kafka, Amazon SQS 등이 있다.
    • 엄밀히 말하면 Kafka는 메세지 큐가 아니라 이벤트 스트리밍 플랫폼이다. 그런데 현재는 지원하는 기능이 서로 수렴된다.
  • producer가 메일함에 메일을 넣어주고, consumer는 알아서 그 메일을 열어보는 구조 같은 것이다. 언제 열어 볼 지는 consumer마음대로다.

메세지 큐의 기본 기능을 정리하자면,

  • 생산자는 메세지를 메세지 큐에 발행하고
  • 소비자는 큐를 subscribe 하고, 구독한 메세지를 소비한다.
  • 메세지 큐는 생산자와 소비자 사이의 결합을 느슨하게 하는 서비스로, 생산자와 소비자의 독립적인 운영 및 규모 확장을 가능하게 하는 역할을 담당한다.
  • 생산자와 소비자는 모두 클라이언트-서버 모델의 관점에서 보면 클라이언트
    • 서버 역할을 하는 것은 메세지 큐이고,
    • 클라이언트와 서버는 네트워크를 통해 통신하는 것이다.

토픽, 파티션, 브로커

토픽

  • 메세지는 토픽에 보관된다.
  • 토픽에 보관되는 데이터의 양이 커져서 서버 한 대로 감당하기 힘든 상황이 되면, 파티션 즉, 샤딩 기법을 활용하는 것이다.
  • 토픽을 여러 파티션으로 분할한 다음에 메시지를 모든 파티션에 균등하게 나눠보낸다.

파티션

  • 파티션은 토픽에 보낼 메세지의 작은 부분집합 같은 것이다.
  • 파티션은 메세지 큐 클러스터 내의 서버에 고르게 분산 배치한다.
  • 파티션을 유지하는 서버를 브로커라 부른다. 파티션을 브로커에 분산하는 것이 높은 규모의 확장성을 달성하는 방법이다. 토픽의 용량을 확장하고 싶으면 파티션의 개수를 늘리면 된다.
  • 파티션은 FIFO 큐처럼 동작한다. 같은 파티션 안에서는 메세지 순서가 유지된다.
  • 파티션 내에서 메세지 위치를 offset이라 한다.
  • 생산자가 보낸 메세지는 해당 토픽의 파티션 가운데 하나로 보내진다.
    • 메세지에는 사용자 ID같은 key를 붙일 수 있다.
    • 같은 key를 가진 모든 메세지는 같은 파티션으로 보내진다.
    • key가 없는 메세지는 무작위로 선택된 파티션으로 전송된다.
  • 토픽을 구독하는 소비자는 하나 이상의 파티션에서 데이터를 가져온다.
  • 토픽을 구독하는 소비자가 여럿일 경우, 각 구독자는 해당 토픽을 구성하는 파티션의 일부를 담당하게 된다. 이 소비자들을 해당 토픽의 consumer group이라고 부른다.

소비자 그룹

  • 소비자 그룹 내 소비자는 토픽에서 메세지를 소비하기 위해 서로 협력한다.
  • 하나의 소비자 그룹은 여러 토픽을 구독할 수 있고, 오프셋을 별도로 관리한다.

Life cycle

  1. Producer는 message를 queue에 보낸다 Consumer는 현재 Message를 사용하거나 사용하지 못할 수도 있기 때문에 Queue는 Consumer가 사용할 수 있을 때까지 Message를 유지, 보관한다.

  2. Consumer는 message를 처리할 준비가 되면 queue에서 Message를 검색하고, 사용한다. queue는 message를 즉시 삭제하지 않으며 consumer가 처리를 완료할 때까지 유지한다. queue는 일시적으로 message를 다른 사용자가 참조하지 못하도록 lock을 걸게 된다.

  3. Consumer가 message를 처리하고 queue에서 message가 삭제된다

메세지 큐의 주요 특징

  1. 비동기 처리: 생산자가 메세지를 큐에 넣으면, 소비자는 그 메세지를 즉시 가져갈 필요가 없다. 이로 인해 생산자와 소비자는 서로 독립적으로 동작할 수 있다.
  2. 내결함성(Fault Tolerance): 메세지 큐는 일시적인 네트워크 문제나 시스템 장애가 발생해도 메세지를 안전하게 저장할 수 있다. 이렇게 하면, 소비자가 시스템이 복구된 후에도 메세지를 잃지 않고 처리할 수 있다.
  3. 부하 분산(Load Balancing): 여러 소비자가 메세지를 처리하는 경우, 메세지 큐는 작업을 여러 소비자에게 고르게 분배해 시스템 부하를 효율적으로 관리할 수 있다.
  4. 데이터 일관성: 여러 생산자와 소비자가 메세지 큐를 통해 데이터를 주고받기 때문에, 메세지 순서를 유지하거나 메세지를 한번만 처리하는 등의 일관성을 유지할 수 있다.

메세지 큐를 사용하면 좋은 점

  1. 결합도 완화(decoupling) : 메세지 큐를 사용하면 컴포넌트 사이의 강한 결합이 사라지므로 각각을 독립적으로 갱신할 수 있다.
  2. 규모 확장성 개선 : 메세지 큐에 데이터를 생산하는 producer와 큐에서 메세지를 소비하는 consumer 시스템 규모를 트래픽 부하에 맞게 독립저긍로 늘릴 수 있다. 예를 들어 트래픽이 많이 몰리는 시간에는 더 많은 consumer를 추가하여 처리 용량을 늘릴 수 있다.
  3. 성능 개선 : 메세지 큐를 사용하면 비동기 통신이 쉽게 가능하다. 생산자는 응답을 기다리지 않고도 메세지를 보낼 수 있고, 소비자는 읽을 메세지가 있을 때만 해당 메세지를 소비하면 된다. 서로를 기다릴 필요가 없다.

메세징 모델

가장 많이 사용되는 메세지 모델은 일대일Point-to-Point와 발행-구독pub/sub 모델이다.

Point-to-Point : 일대일 모델

  • 전통적인 메세지 큐에서 흔히 발견되는 모델
  • 일대일 모델에서 큐에 전송된 메세지는 오직 한 소비자만 가져갈 수 있다.
  • 소비자가 아무리 많아도 메세지는 오직 한 소비자만 가져갈 수 있다.
  • 어떤 소비자가 메세지를 가져갔다는 사실을 큐에 알리면(acknowledge) 해당 메세지는 큐에서 삭제된다.
  • 이 모델은 데이터 보관을 지원하지 않는다.

jmsptp

apach jms의 poin

Pub/Sub : 발행-구독 모델

  • 토픽: 메세지를 주제별로 정리하는데 사용되는 개념
    • 각 토픽은 메세지 큐 서비스 전반에 고유한 이름을 가진다.
  • 메세지를 보내고 받을때는 토픽을 통해 보내고 받게 된다.
  • 토픽에 전달된 메세지는 해당 토픽을 구독하는 모든 소비자에게 전달된다.

jmspubsub

pubsub

다양한 활용 사례와 고급 기능

1. 메시지 큐의 다양한 활용 사례

메시지 큐는 단순한 데이터 전달 수단을 넘어 다양한 시스템 아키텍처에서 핵심적인 역할을 수행한다.

  • 마이크로서비스 아키텍처:
    • 각 서비스 간의 비동기 통신을 위한 메커니즘으로 활용된다.
    • 서비스 간의 결합도를 낮추고, 각 서비스의 독립적인 개발 및 배포를 가능하게 한다.
  • 이벤트 드리븐 아키텍처:
    • 시스템 내에서 발생하는 다양한 이벤트를 감지하고 처리하는 데 사용된다.
    • 이벤트 발생 시 메시지를 큐에 발행하고, 해당 이벤트를 처리하는 서비스가 메시지를 소비하여 처리한다.
  • 배치 처리:
    • 대량의 데이터를 비동기적으로 처리할 때 사용된다.
    • 데이터를 큐에 저장하고, 여러 개의 worker가 큐에서 데이터를 가져와 처리한다.
  • 로그 처리:
    • 시스템 로그를 큐에 저장하여 실시간 분석, 모니터링, 저장 등을 수행한다.
  • 데이터 스트리밍:
    • 실시간 데이터 스트림을 처리하고 분석하는 데 사용된다.
    • Kafka와 같은 메시지 큐 시스템은 데이터 스트리밍 플랫폼으로도 활용된다.

2. 메시지 큐의 고급 기능

  • 데드 레터 큐:
    • 소비자가 메시지를 처리하지 못하거나 오류가 발생했을 때, 메시지를 별도의 큐(데드 레터 큐)로 이동시켜 관리한다.
    • 오류 발생 원인을 분석하고 재처리할 수 있도록 돕는다.
  • 트랜잭션:
    • 여러 메시지에 대한 처리를 하나의 트랜잭션으로 묶어서 처리한다.
    • 모든 메시지가 성공적으로 처리되었을 때만 커밋하고, 실패한 경우에는 롤백한다.
  • 메시지 우선순위:
    • 메시지에 우선순위를 부여하여 중요한 메시지를 먼저 처리할 수 있도록 한다.
  • 메시지 지연:
    • 메시지를 특정 시간 후에 소비할 수 있도록 지연시킬 수 있다.
  • 메시지 필터링:
    • 메시지의 헤더나 내용을 기반으로 특정 메시지만 소비하도록 필터링할 수 있다.

결론

메시지 큐는 분산 시스템에서 비동기 통신을 위한 강력한 도구다. 시스템의 복잡성을 줄이고, 확장성을 높이며, 오류 처리를 개선하는 데 도움을 줄 수 있다.

reference

가상 면접 사례로 배우는 대규모 시스템 설계 기초 2
Apach JMS Message Queue(메시지 큐)란 무엇이며 어떤 특징들이 있을까? PUB/SUB, 잘 알고 쓰자!