본문 바로가기

CS/Spring

Kafka 알아보기

반응형
Kafka 알아보기

 

Kafka란?

성능과 기능이 좋은 큐라고 할 수 있다. 

주로 대량의 이벤트 스트림 데이터를 처리하고 여러 시스템 간에 데이터를 신속하게 전송하는 데 사용된다.

 

Kafka의 주요 특징

  • 고성능: 초당 수백만 개의 메시지 처리 가능
  • 확장성: 클러스터 형태로 노드를 추가하여 쉽게 확장 가능
  • 내결함성: 노드 장애 시 자동 복구 가능
  • 비동기 처리: 메시지를 보내고, 나중에 원하는 시점에서 처리 가능
  • 이벤트 기반 아키텍처 지원: 마이크로서비스 간 메시지 교환 가능

Kafka의 핵심 구성 요소

📌 Producer 

    • 데이터를 생성하고 Kafka에 전송하는 역할
    • 특정 Topic에 메시지를 보내며, 파티션을 지정 가능
    • 프로덕션 중에 키를 보내는 것은 필수 X

 

📌 Broker 

  • Kafka 서버로서 Producer가 보낸 메시지를 저장하고 관리
  • 여러 개의 Broker가 클러스터를 이루어 분산 저장 & 처리 (브로커끼리 연결하면 클러스터가 된다)
  • 각 Broker는 여러 TopicPartition을 관리

 

📌 Topic 

  • 메시지가 저장되는 단위
  • Topic은 1개 이상의 Partition으로 구성
  • 예) "reservation-events"라는 Topic이 있으면 예약 이벤트 저장

📌 Partition 

  • Topic을 여러 개의 Partition으로 나누어 병렬 처리 가능
  • Kafka는 하나의 Partition을 하나의 Consumer에게만 할당
  • Partition 내부의 메시지는 Offset을 기반으로 순서 보장 (단, 파티션 간 순서 보장은 안됨)
  • 데이터는 유한한 시간 동안 저장 (기본값: 7일, log.retention.ms 설정 가능)
  • Key가 없는 경우 Round-Robin 방식으로 랜덤 하게 할당
  • Key가 있는 경우 Key 해시 기반으로 특정 Partition에 할당
  • Partition 개수는 증가할 수 있지만, 감소는 불가능하여 처음 설계 시 신중하게 고려

📌 Consumer 

  • Kafka에서 데이터를 읽어가는 서비스 (메시지를 소비하며 Offset을 유지해 처리 상태 관리)
  • Consumer Group을 사용하면 여러 Consumer가 데이터를 병렬로 처리 가능
  • 만약 Consumer 수가 Partition보다 많으면 일부 Consumer는 대기 상태

Kafka 리밸런싱 최적화 

📌 리밸런싱이란?

Consumer 그룹 내에서 Partition을 재배치하는 과정

 

💡 리밸런싱이 발생하는 경우:

  • Consumer 그룹의 Consumer 수가 변할 때 (추가/제거)
  • Consumer네트워크 장애가 발생했을 때
  • 특정 Consumer오랫동안 응답하지 않을 때
  • Partition이 증가했을 때

Kafka는 리밸런싱을 통해 기존 Consumer가 할당받은 Partition을 새로운 Consumer에게 재할당한다.
그러나 리밸런싱 중에는 메시지를 소비할 수 없기 때문에, 빈번한 리밸런싱은 성능 저하를 유발할 수 있다.

 

📌 리밸런싱 최적화 방법

1. Consumer 개수를 파티션 개수와 동일하게 맞추기

  • Consumer 그룹 내 Consumer 개수를 Partition 개수와 동일하게 유지하면 불필요한 리밸런싱을 줄일 수 있다.
  • Consumer 개수가 Partition보다 많으면 일부 Consumer는 대기 상태가 되어 비효율적이다
💡 Best : Consumer 수 = Partition 수

 

2. session.timeout.ms 값 조정하기

  • Consumer가 일정 시간 동안 응답하지 않으면 Kafka는 Consumer를 죽은(dead) 상태로 판단하고 리밸런싱을 수행한다.
  • 이 시간을 적절히 조정하면 불필요한 리밸런싱을 줄일 수 있다.
session.timeout.ms=45000  # 기본값: 45초 (설정 가능)

 

3. Static Membership 사용 (group.instance.id 설정)

💡 Static Membership이란?
  • Consumer가 죽었다가 다시 실행되더라도 기존 Partition을 유지할 수 있도록 하는 기능
  • Consumer가 다시 참여해도 Kafka가 이전 Partition을 그대로 유지하기 때문에 불필요한 리밸런싱을 줄여 성능을 최적화할 수 있다.
  • 단기적인 장애 복구 시 매우 유용
spring:
  kafka:
    consumer:
      group-id: my-consumer-group
      properties:
        group.instance.id: my-consumer-instance-1  # Static Membership 활성화

 

Kafka의 활용 사례

Kafka는 대량의 데이터를 빠르게 처리해야 하는 시스템에서 주로 사용된다.

 

📌 실시간 데이터 스트리밍

  • 예시: 금융권에서 실시간 거래 내역을 수집하고 분석
  • 고성능 데이터 전송으로 신속한 데이터 분석 가능

📌 로그 및 모니터링 시스템

  • 예시: 서버 로그 데이터를 실시간으로 수집하여 분석 (ELK Stack과 연계)
  • 장애 발생 시 빠르게 탐지하여 대응 가능

📌 이벤트 기반 아키텍처

  • 예시: 마이크로서비스 간 주문 및 결제 이벤트 전달
  • 서비스 간 결합도를 낮추고 확장성을 확보할 수 있음

📌 데이터 파이프라인

  • 예시: 데이터베이스 변경 사항을 데이터 웨어하우스로 전송 (ETL 프로세스)
  • 대량의 데이터를 안정적으로 전송하고, 중간 장애 발생 시 복구 가능
  •  
정리

Kafka 환경에서 리밸런싱은 필수적인 과정이지만 이를 최적화하면 성능 저하를 방지하고 안정적인 메시지 처리가 가능하다.

 

참고 

https://medium.com/@cobch7/kafka-producer-and-consumer-f1f6390994fc

반응형

'CS > Spring' 카테고리의 다른 글

동시성 제어 방식 알아보기  (0) 2025.02.02
TDD 방법론 알아보기  (4) 2024.12.29
Spring Bean 알아보기  (0) 2024.05.31
DataSource 알아보기  (0) 2024.03.31
Connection Pool 이해하기  (3) 2024.03.23