# Kafka VS RabbitMQ

----- AWS Version

Kafka와 RabbitMQ는 스트림 처리에 사용할 수 있는 메시지 대기열 시스템입니다. 데이터 스트림은 고속 처리가 필요한 대용량의 연속적인 증분 데이터입니다. 온도 또는 기압의 실시간 변화를 관찰하기 위해 지속적으로 수집 및 처리해야 하는 환경에 대한 센서 데이터를 예로 들 수 있습니다. RabbitMQ는 여러 소스에서 스트리밍 데이터를 수집하고 처리를 위해 다른 대상으로 라우팅하는 분산 메시지 브로커입니다. Apache Kafka는 실시간 데이터 파이프라인 및 스트리밍 애플리케이션을 구축하는 데 사용되는 스트리밍 플랫폼입니다. Kafka는 뛰어난 확장성과 내결함성, 내구성이 뛰어난 메시징 시스템을 제공하며 RabbitMQ보다 더 많은 기능을 갖추고 있습니다.

# 아키텍처 차이점: Kafka vs RabbitMQ
RabbitMQ와 Apache Kafka 둘 다 생산자가 소비자에게 메시지를 보낼 수 있습니다. 생산자는 정보를 게시하는 애플리케이션이고, 소비자는 정보를 구독하고 처리하는 애플리케이션입니다.

RabbitMQ와 Kafka에서 생산자와 소비자가 상호 작용하는 방식이 서로 다릅니다. RabbitMQ의 생산자는 메시지를 보내고 메시지가 의도한 소비자에게 도착하는지 모니터링합니다. 반면 Kafka의 생산자는 소비자가 메시지를 검색했는지 여부에 관계없이 메시지를 대기열에 게시합니다.

RabbitMQ는 우편물을 받아서 수취인에게 배달하는 우체국이라고 생각하시면 됩니다. 반면 Kafka는 생산자가 게시하는 다양한 장르의 메시지를 진열대에 정리하는 도서관과 비슷합니다. 그 후 소비자는 각 진열대에 진열된 메시지를 읽고 읽은 내용을 기억합니다. 

# RabbitMQ 아키텍처 접근 방식
RabbitMQ 브로커는 다음 구성 요소를 사용하여 지연 시간을 줄이고 복잡한 메시지를 분산할 수 있습니다.

    * 교환소는 생산자로부터 메시지를 수신하고 메시지를 어디로 라우팅할지 결정합니다.
    * 대기열은 교환소에서 메시지를 받아 소비자에게 보내는 스토리지입니다.
    * 바인딩은 교환소와 브로커를 연결하는 경로입니다.

RabbitMQ에서 라우팅 키는 교환소에서 특정 대기열로 메시지를 라우팅하는 데 사용되는 메시지 속성입니다. 생산자가 메시지를 교환소에 보낼 때 메시지에 라우팅 키가 포함됩니다. 그러면 교환소에서는 이 라우팅 키를 사용하여 메시지를 어느 대기열로 보낼 것인지 결정합니다.

# Kafka 아키텍처 접근 방식
Kafka 클러스터는 더 복잡한 아키텍처를 사용하여 처리량이 높은 스트림 이벤트를 처리합니다. Kafka의 주요 구성 요소는 다음과 같습니다.

    * Kafka 브로커는 생산자가 소비자에게 데이터를 스트리밍할 수 있게 해주는 Kafka 서버입니다. Kafka 브로커에는 토픽과 해당 파티션이 포함되어 있습니다. 
    * 토픽은 유사한 데이터를 Kafka 브로커에 그룹화하는 데이터 스토리지입니다. 
    * 파티션은 소비자가 구독하는 토픽 내의 더 작은 데이터 스토리지입니다. 
    * ZooKeeper는 Kafka 클러스터와 파티션을 관리하여 내결함성 스트리밍을 제공하는 특수 소프트웨어입니다. ZooKeeper는 최근에 Apache Kafka Raft(KRaft) 프로토콜로 대체되었습니다.

Kafka의 생산자는 각 메시지의 메시지 키를 할당합니다. 그러면 Kafka 브로커는 해당 토픽의 선행 파티션에 메시지를 저장합니다. KRaft 프로토콜은 합의 알고리즘을 사용하여 선행 파티션을 결정합니다. 

더욱 자세한 내용은 : https://aws.amazon.com/ko/compare/the-difference-between-rabbitmq-and-kafka/


----- ChatGPT Version

# Kafka와 RabbitMQ 소개  
    * Kafka: Apache Kafka는 대용량 데이터 스트리밍을 위해 설계된 분산 이벤트 스트리밍 플랫폼입니다. 주로 실시간 데이터 피드를 처리하고 분석하기 위해 사용됩니다.
    * RabbitMQ: RabbitMQ는 신뢰성 있는 메시지 전달을 보장하는 메시지 브로커로, 메시지를 발행하고 구독할 수 있도록 도와줍니다. 다양한 메시징 패턴을 지원합니다.

# 주요 개념과 차이점
## 1. 메시지 처리 방식

    * Kafka:
        * 이벤트 스트리밍 방식으로, 데이터가 로그 파일처럼 지속적으로 추가됩니다.
        * 프로듀서(Producer)가 토픽(Topic)에 이벤트를 쓰고, 컨슈머(Consumer)가 토픽에서 이벤트를 읽어갑니다.
        * 메시지는 각 파티션(Partition)에 순차적으로 추가되며, 컨슈머는 특정 오프셋(Offset)부터 메시지를 읽습니다.
        * 여러 컨슈머 그룹이 같은 메시지를 독립적으로 소비할 수 있습니다.

    * RabbitMQ:
        * 메시지 큐잉 방식으로, 메시지가 큐(Queue)에 저장됩니다.
        * 프로듀서가 메시지를 큐에 넣으면, 컨슈머가 메시지를 큐에서 가져갑니다.
        * 메시지가 큐에서 소비되면 삭제됩니다.
        * 메시지를 소비하는 방식에 따라, 라운드 로빈 방식으로 여러 컨슈머에게 메시지를 분배할 수 있습니다.

## 2. 메시지 보존

    * Kafka:
        * 메시지는 설정된 보존 기간 동안(예: 며칠, 몇 주) 토픽에 저장됩니다.
        * 보존 기간이 지나면 자동으로 삭제됩니다.
        * 이벤트를 재처리하거나 분석할 수 있도록 일정 기간 동안 저장하는 데 적합합니다.
    * RabbitMQ:
        * 메시지는 큐에서 소비될 때까지 보존됩니다.
        * 메시지가 처리되면 즉시 큐에서 삭제됩니다.
        * 메시지 전달을 보장하고, 한 번만 처리해야 하는 작업에 적합합니다.

## 3. 데이터 처리 모델

   * Kafka:
        * 발행/구독(Pub/Sub) 모델: 여러 컨슈머가 같은 메시지를 구독하고 독립적으로 처리할 수 있습니다.
        * 스트리밍 데이터 처리: 실시간으로 들어오는 데이터를 처리, 분석, 모니터링하는 데 강점이 있습니다.
    * RabbitMQ:
        * 전송/소비 모델: 메시지가 큐에 들어가면 하나의 컨슈머가 메시지를 소비하고 처리합니다.
        * 작업 대기열(Task Queue): 작업을 여러 작업자에게 분배하여 병렬로 처리하는 데 유용합니다.

## 4. 성능 및 확장성
    * Kafka:
        * 대용량의 데이터를 높은 처리량으로 처리할 수 있도록 설계되었습니다.
        * 분산 시스템으로 설계되어, 여러 노드로 확장하여 처리 성능을 높일 수 있습니다.
    * RabbitMQ:
        * 낮은 지연시간과 높은 신뢰성을 제공하지만, Kafka보다는 처리량이 낮을 수 있습니다.
        * 클러스터링 및 페더레이션을 통해 확장성을 제공하지만, Kafka만큼 대규모 데이터 스트리밍에 최적화되지는 않았습니다.

# 요약
Kafka는 대규모 실시간 데이터 스트리밍과 분석에 적합한 이벤트 스트리밍 플랫폼입니다. 데이터 보존 기간이 있으며, 여러 컨슈머 그룹이 독립적으로 메시지를 소비할 수 있습니다.
RabbitMQ는 신뢰성 있는 메시지 전달을 보장하는 메시지 큐 시스템으로, 메시지를 한 번만 처리해야 하는 작업 대기열에 적합합니다. 메시지는 소비되면 즉시 삭제됩니다.
