25.03.13 TIL Kafka

신성훈·2025년 3월 13일

TIL

목록 보기
147/162

1. Kafka란?

Kafka는 분산 메시징 시스템으로 대량의 데이터를 빠르고 안정적으로 처리할 수 있도록 설계된 오픈소스 메시지 브로커이다.

  • 로그 수집, 이벤트 스트리밍, 실시간 데이터 처리 등에 사용된다.
  • LinkedIn에서 개발했으며 현재 Apache Kafka 프로젝트로 운영되고 있다.
  • 높은 처리량과 내결함성을 제공하며 분산 시스템 환경에서 뛰어난 성능을 발휘한다.

2. Kafka 아키텍처

Kafka는 Producer, Broker, Consumer 등의 구성 요소로 이루어져 있다.

  1. Producer (생산자)

    • 메시지를 생성하여 Topic으로 전송하는 역할을 한다.
    • 여러 개의 Partition에 메시지를 분산시켜 부하를 분산할 수 있다.
  2. Broker (중개자)

    • Kafka 클러스터의 핵심 구성 요소로 메시지를 저장하고 관리하는 역할을 한다.
    • 하나의 클러스터는 여러 개의 Broker로 구성될 수 있다.
  3. Consumer (소비자)

    • Topic에 저장된 메시지를 가져와 처리하는 역할을 한다.
    • Consumer Group을 활용하여 부하를 나누어 처리할 수 있다.
  4. Topic & Partition

    • 메시지는 Topic에 저장되며, Partition 단위로 나누어져 분산 저장된다.
    • Partition을 이용하여 수평 확장성을 보장할 수 있다.
  5. Zookeeper

    • Kafka의 메타데이터를 관리하는 역할을 한다.
    • Broker의 상태를 추적하고, 리더 선출 등의 작업을 수행한다.

3. Kafka 메시지 전송 방식

Kafka는 Pull 방식으로 메시지를 소비한다. Consumer가 필요한 시점에 Broker로부터 메시지를 가져온다.

  • At Most Once: 메시지가 한 번만 전송되며, 유실될 가능성이 있다.
  • At Least Once: 메시지가 최소 한 번은 전송되며, 중복 메시지가 발생할 수 있다.
  • Exactly Once: 메시지가 정확히 한 번만 전송됨을 보장한다.

4. Kafka의 특징

  1. 높은 처리량과 확장성

    • 분산 환경에서 동작하며, Partition을 이용한 데이터 병렬 처리가 가능하다.
  2. 내결함성

    • 복제를 통해 Broker 장애 시에도 데이터 유실 없이 복구할 수 있다.
  3. 장기적인 데이터 저장 가능

    • 메시지를 영구적으로 저장할 수 있어 데이터 유실을 방지할 수 있다.
  4. 다양한 언어 지원

    • Java, Python, Go 등 여러 프로그래밍 언어에서 사용할 수 있다.

5. Kafka를 활용한 예제

Spring Boot 환경에서 Kafka를 사용하는 간단한 예제 코드

1) Spring Boot 프로젝트 설정

먼저 spring-kafka 의존성을 추가한다.

<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
    <version>2.8.0</version>
</dependency>

2) Kafka Producer 구현

@Service
public class KafkaProducer {
    private final KafkaTemplate<String, String> kafkaTemplate;

    public KafkaProducer(KafkaTemplate<String, String> kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }

    public void sendMessage(String message) {
        kafkaTemplate.send("example-topic", message);
    }
}

3) Kafka Consumer 구현

@Service
public class KafkaConsumer {
    @KafkaListener(topics = "example-topic", groupId = "my-group")
    public void listen(String message) {
        System.out.println("Received Message: " + message);
    }
}

4) Kafka 설정 파일 (application.yml)

spring:
  kafka:
    bootstrap-servers: localhost:9092
    consumer:
      group-id: my-group
      auto-offset-reset: earliest
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer

6. Kafka의 장점과 사용 사례

장점

  • 빠른 데이터 처리 속도: 대량의 데이터를 고속으로 처리 가능
  • 수평 확장성: 노드를 추가하여 확장 가능
  • 내결함성 보장: 장애 발생 시 데이터 유실 방지
  • 다양한 데이터 처리 방식 지원: 스트리밍 및 배치 처리 모두 가능

사용 사례

  • 로그 수집 및 분석 (ELK Stack)
  • 실시간 이벤트 스트리밍 (주문 처리, 실시간 모니터링 등)
  • 마이크로서비스 간 메시지 브로커 역할
  • IoT 데이터 수집 및 처리

7. 느낀 점

Kafka는 대량의 데이터를 빠르게 처리하는 데 최적화된 분산 메시징 시스템으로
실시간 데이터 스트리밍, 로그 수집, 마이크로서비스 통신에서 강점을 발휘한다.
Spring Kafka를 활용하면 Kafka를 쉽게 연동할 수 있으며 마이크로서비스 아키텍처에서의 데이터 흐름을 효율적으로 관리할 수 있다.
Kafka의 구조와 동작 방식을 이해하면 데이터 처리 성능을 최적화할 수 있으므로 실무에서 적극 활용할 수 있도록 더 깊이 공부해야겠다고 느꼈다.

profile
조급해하지 말고, 흐름을 만들고, 기록하면서 쌓아가자.

0개의 댓글