메시지 큐와 카프카

 

메시지 큐란?

메시지 큐는 분산된 환경에서 프로세스나 프로그램의 시스템 간 데이터를 교환하기 위해 사용되는 통신 기법이다.

 

그리고 메시지를 일시적으로 저장하는 큐(queue)로 송신자(producer)와 수신자(receiver/consumer) 간비동기 통신을 가능하게 한다.

https://tecoble.techcourse.co.kr/post/2021-09-19-message-queue/

 

메시지 큐 사용 이유

이러한 메시지 큐를 사용하는 이유가 뭘까?

  1. 비동기 처리 : 메시지 큐를 사용하면 producer와 consumer가 독립적으로 작동할 수 있다.
    이는 producer는 메시지를 큐에 넣고 바로 다음 작업을 처리할 수 있고, consumer도 메시지를 수신하며 자신의 속도에 맞게 메시지를 처리할 수 있다.
  2. 느슨한 결합 (decoupling) : 시스템 간 서로 직접 통신하지 않고 메시지 큐를 이용하기 때문에 시스템의 각 구성 요소가 느슨하게 결합되어 있다.
    = producer와 consumer는 서로 알 필요 없이 독립적으로 구성되어 있기 때문에 결합이 느슨하여 확장에 유리하다.
  3. 확장성 : 시스템의 부하가 커져 처리해야 할 메시지가 많아지면 consumer를 늘려 처리량을 높일 수 있다.
  4. 내결함성 : 메시지 큐는 메시지를 안전하게 저장하기 때문에 시스템에 장애가 발생해도 메시지는 큐에 저장되어 있기 때문에 나중에 컨슈머에서 메시지를 소비하여 처리할 수 있다.

 

Kafka

다양한 메시지 큐 구현체 중 왜 카프카를 사용하며, 카프카란 무엇인가?

 

Kafka란?

우선 kafka가 무엇인지 간단하게 살펴보자.

 

kafka는 분산형 스트리밍 플랫폼이자 메시지 시스템으로, 대용량의 데이터와 실시간 데이터를 처리하는데 특화된 메시지 시스템이다.
그리고 높은 처리량, 확장성, 내구성, 실시간 데이터 처리 기능 등 다양한 장점을 제공하여, 대규모 데이터 스트림 처리에 적합하다.

 

카프카를 사용하는 이유

RabbitMQ, Redis Pub/Sub 등등 여러 메시지 큐 구현체가 존재하는데 Kafka를 사용하는 이유는 뭘까?

 

RabbitMQ

  • 큐(queue) 기반: RabbitMQ는 큐(queue)를 기반이기 때문에 메시지는 큐에 쌓이고, 컨슈머가 큐에서 메시지를 처리한다. 메시지가 처리되면 큐에서 삭제된다.
  • 메시지 전달 보장: RabbitMQ는 메시지의 안정적 전달과 처리를 보장한다. 신뢰성 높은 메시지 전달을 위해 높은 지연 시간을 감수한다.
  • 내구성: 메시지는 메모리와 디스크에 저장되며, 큐에 저장된 메시지는 컨슈머가 처리한 후 삭제한다.

Redis Pub/Sub

  • 비동기: 발행-구독(pub/sub) 모델을 통해 메시지를 비동기적으로 전송
  • 실시간 처리: 메시지가 즉시 전달되며, 구독자가 실시간으로 메시지를 받을 수 있다.
  • 내구성: 메시지는 메모리에만 저장되기 때문에 메시지를 유실할 가능성이 있다.

Kafka

  • 로그 기반: Kafka는 로그(log) 기반으로, 메시지는 특정 토픽(topic)의 파티션(partition)에 순차적으로 추가된다. 각 메시지는 오프셋(offset)을 가지고 있어, 컨슈머는 특정 오프셋부터 메시지를 읽을 수 있다.
  • 성능: 높은 처리량과 낮은 지연 시간으로 대규모/실시간 데이터 처리에 적합하다.
  • 내구성: 메시지는 디스크에 저장되고 메시지를 설정된 기간 동안 유지된다. 컨슈머가 메시지를 읽어도 삭제되지 않기 때문에 컨슈머는 필요에 따라 메시지를 반복해서 소비할 수 있다.

그래서 Kafka를 사용하는 이유?

  • 메시지 보존 및 재처리 : Kafka는 메시지를 디스크에 보관하고, RabbitMQ와 다르게 메시지를 읽어도 삭제되지 않기 때문에 반복적으로 읽고 재처리할 수 있다.
  • 내결함성 : Kafka는 데이터를 복제하기 때문에, 장애가 발생하더라도 데이터의 유실을 막을 수 있다. 
  • 확장성 : Kafka는 분산 시스템으로 수평 확장에 매우 유리하다.

 

(번외) RabbitMQ를 사용하는 경우?

RabbitMQ는 신뢰성이 중요한 작업 큐나 요청-응답 패턴이 필요한 경우 적합하다.

 

Kafka의 주요 구성 요소

  1. 토픽(Topic): 메시지가 저장되고 관리되는 공간 단위이다. 메시지는 특정 토픽에 적재되고, 해당 토픽을 구독한 소비자가 메시지를 읽는다.
  2. 파티션(Partition): 토픽은 여러 파티션으로 나뉘며, 각 파티션은 순서대로 메시지를 저장한다. 토픽 내부에 1개 이상의 파티션을 통해 카프카의 핵심인 확장성과 내결함성을 제공한다.
  3. 프로듀서(Producer): 메시지를 생성하고 특정 토픽에 적재하는 클라이언트이다.
  4. 컨슈머(Consumer): 특정 토픽을 구독하고, 해당 토픽의 메시지를 읽고 처리하는 클라이언트이다.
  5. 브로커(Broker): Kafka 서버 인스턴스라고 생각하면 된다. 프로듀서로부터 전달받은 메시지를 저장하고 관리하며, 프로듀서와 컨슈머 간의 데이터 전송을 관리한다.