Apache Kafka:: 카프카
🙊

Apache Kafka:: 카프카

Created
Jul 30, 2024 12:26 AM
Last edited time
Last updated July 30, 2024
Tags
Backend
Language
URL

Intro::

아파치 카프카에 대해서 알아봅시다.
 

카프카란??

파이프라인, 스트리밍 분석, 데이터 통합 및 미션 크리티컬 애플리케이션을 위해 설계된 고성능 분산 이벤트 스트리밍 플랫폼입니다. Pub-Sub 모델의 메시지 큐 형태로 동작하며 분산환경에 특화되어 있습니다.
 

메시지 큐 Message Queue 란??

메시지 큐 는 메시지 지향 미들웨어를 구현한 시스템으로 프로그램 간의 데이터를 교환할 때 사용하는 기술입니다.
  • 비동기: 임시 저장소에 저장해 두기 때문에 비동기적 처리가 가능합니다.
  • 낮은 결합도: 애플리케이션 분리
  • 확장성: producer 혹은 consumer 서비스를 원하는대로 확장 가능합니다.
  • 탄력성: consumer가 다운되더라도 애플리케이션이 중단되는 것이 아니며 메시지는 남아있습니다.
  • 보장성: 메시지 큐에 들어간 모든 메시지는 consumer 서비스에게 전달됩니다.
 

메시지 브로커(Message Broker)

메시지 브로커는 서로 다른 애플리케이션 간의 메시지(데이터)를 주고받을 수 있도록 중개하는 시스템입니다. 주로 비동기 통신을 통해 애플리케이션 간의 결합도를 낮추는 데 사용됩니다. 메시지 브로커의 주요 기능은 다음과 같습니다:
  1. 메시지 큐잉: 메시지를 큐(queue)에 저장하여 소비자가 준비될 때까지 보관합니다.
  1. 메시지 전달 보장: 메시지가 손실되지 않도록 보장합니다.
  1. 로드 밸런싱: 여러 소비자 간에 메시지를 고르게 분배합니다.
  1. 순서 보장: 메시지가 특정 순서대로 전달되도록 보장합니다.
메시지 브로커의 예로는 RabbitMQ, Apache ActiveMQ, IBM MQ 등이 있습니다.

이벤트 브로커(Event Broker)

이벤트 브로커는 이벤트 기반 아키텍처에서 이벤트를 발행하고 구독하는 시스템입니다. 이벤트는 시스템 내에서 발생하는 중요한 상태 변화나 액션을 의미합니다. 이벤트 브로커의 주요 기능은 다음과 같습니다:
  1. 발행/구독 모델: 이벤트를 발행자(publisher)와 구독자(subscriber) 간에 비동기적으로 전달합니다.
  1. 실시간 처리: 이벤트를 실시간으로 처리하여 즉각적인 반응을 가능하게 합니다.
  1. 스케일링: 많은 이벤트와 구독자를 처리할 수 있도록 확장성을 제공합니다.
이벤트 브로커의 예로는 Apache Kafka, Amazon Kinesis, Google Cloud Pub/Sub 등이 있습니다.

차이점 요약

  • 목적: 메시지 브로커는 주로 데이터를 안정적으로 전달하는 데 중점을 두고, 이벤트 브로커는 실시간 이벤트 처리에 중점을 둡니다.
  • 구조: 메시지 브로커는 큐를 사용하고, 이벤트 브로커는 발행/구독 모델을 사용합니다. 또한 이벤트 브로커는 publisher가 생산한 이벤트를 이벤트 처리 후에 바로 삭제하지 않고 저장하여, 이벤트 시점이 저장되어 있어 consumer가 특정 시점부터 이벤트를 다시 consume 할 수 있는 장점이 있습니다.
  • 사용 사례: 메시지 브로커는 주문 처리 시스템, 로그 수집 등에 사용되고, 이벤트 브로커는 실시간 데이터 스트리밍, 모니터링 시스템 등에 사용됩니다.
 

docker-compose

services: zookeeper: image: confluentinc/cp-zookeeper:latest container_name: zookeeper environment: ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 ports: - "2181:2181" networks: - kafka-net kafka: image: confluentinc/cp-kafka:latest container_name: kafka depends_on: - zookeeper environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1 KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 ports: - "9092:9092" volumes: - kafka-data:/var/lib/kafka/data networks: - kafka-net volumes: kafka-data: networks: kafka-net: driver: bridge
 
# 토픽 생성 kafka-topics --create --topic topic1 --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 # 토픽 확인 kafka-topics --describe --topic topic1 --bootstrap-server localhost:9092 # 프로듀서 실행 kafka-console-producer --topic topic1 --broker-list kafka:9092 # 컨슘어 실행 kafka-console-consumer --topic topic1 --bootstrap-server kafka:9092
 

스프링 + 카프카 예제

궁금한점

  • groupId 가 왜 필요한 것인가??
    • groupId는 Kafka 소비자 그룹을 식별하기 위해 필요합니다. 동일한 groupId를 가진 소비자들은 하나의 그룹으로 묶이며, 각 파티션을 병렬로 소비하게 됩니다.
    • 이를 통해 동일한 메시지가 그룹 내 여러 소비자에게 중복 전달되지 않고, 메시지 처리의 병렬성을 확보할 수 있습니다.
    • 만약 한 토픽의 메시지를 여러 애플리케이션에서 사용해야 한다면, 각 애플리케이션이 다른 groupId를 사용하여 독립적인 소비자 그룹으로 메시지를 소비하면 됩니다.
  • 한 토픽에 여러 파티션일때 해당 토픽을 소모하는 그룹에 consumer가 하나이라면 어떻게 동작하는가???
    • 해당 consumer가 모든 파티션의 메시지를 소비합니다.
 

References::

Loading Comments...