인프라/Kafaka

안녕? kafaka 너는 누구니

물에서육지로 2024. 11. 27. 14:13

Apache Kafka인프라 도구이자 분산 스트리밍 플랫폼으로, 개발 언어는 아닙니다.

Kafka는 주로 대용량의 실시간 데이터 스트리밍, 메시지 큐이벤트 기반 시스템을 구축하는 데 사용되는 인프라 솔루션입니다.

Kafka는 Java로 개발되었지만, 언어 자체는 아니며, 다양한 프로그래밍 언어와의 통합을 지원하는 클라이언트 라이브러리가 제공됩니다. 즉, Kafka는 특정 프로그래밍 언어에 종속되지 않으며, 여러 언어에서 Kafka를 사용할 수 있도록 클라이언트 API를 제공합니다.

Kafka는 메시지 큐(MQ)나 이벤트 스트리밍 시스템으로 자주 사용되며, 주로 실시간 데이터 파이프라인과 데이터 스트리밍 애플리케이션을 구축하는 데 사용됩니다.

Kafka는 무엇인가?

Kafka는 분산 메시징 시스템으로, 다음과 같은 역할을 합니다:

  • 실시간 데이터 스트리밍: 대규모 데이터를 실시간으로 처리하고 전송하는 시스템
  • 메시지 큐: 데이터가 생산자(Producer)에서 소비자(Consumer)로 전달되는 방식
  • 이벤트 스트리밍: 여러 애플리케이션 간의 이벤트를 실시간으로 전송

Kafka의 주요 특징:

  1. 고성능: Kafka는 높은 처리량을 제공하며, 초당 수백만 개의 메시지를 처리할 수 있습니다. 이로 인해 대규모 시스템에서도 원활한 데이터 스트리밍을 처리할 수 있습니다.
  2. 분산 시스템: Kafka는 분산형 아키텍처로 설계되어 있어 여러 서버에 걸쳐 데이터를 분산 저장하고, 고가용성을 보장합니다. 이로 인해 장애 발생 시에도 시스템이 계속 작동할 수 있습니다.
  3. 내구성: Kafka는 메시지를 디스크에 저장하고, 데이터의 복제를 통해 내구성을 보장합니다. 메시지가 한번 기록되면, 설정에 따라 오랜 시간 동안 저장될 수 있습니다.
  4. 확장성: Kafka는 데이터를 여러 서버로 확장하여 분산 처리할 수 있습니다. 이를 통해 시스템의 성능을 손쉽게 확장할 수 있습니다.
  5. 실시간 스트리밍: Kafka는 실시간 데이터 처리에 적합한 시스템으로, 데이터가 발생하는 즉시 처리할 수 있습니다. 주로 로그 데이터, 센서 데이터, 트랜잭션 데이터 등을 실시간으로 처리하는 데 사용됩니다.

Kafka의 단점:

1. 복잡한 설정과 운영

  • Kafka는 분산 시스템으로, 여러 서버로 이루어진 Kafka 클러스터를 설정하고 관리하는 것이 복잡할 수 있습니다.
  • Kafka의 구성, 모니터링, 확장성 관리 등은 상당한 기술적 지식을 요구하며, 이를 잘못 설정하면 성능 저하나 장애가 발생할 수 있습니다.
  • Zookeeper(클러스터 상태 관리 도구)를 사용하는 Kafka 설정은 추가적인 복잡성을 가질 수 있으며, 최근 버전에서는 Zookeeper를 없애는 방향으로 개선되고 있지만 여전히 많은 시스템에서 사용되고 있습니다.

2. 내장된 메시지 큐 시스템의 한계

  • Kafka는 메시지 큐 시스템처럼 사용될 수 있지만, 전통적인 MQ 시스템처럼 메시지 처리의 순서성이나 일시적인 메시지 손실을 보장하지 않습니다. Kafka는 영속적이고 높은 처리량을 제공하지만, 메시지가 시스템에 들어오는 순서대로 완벽히 처리된다고 보장할 수는 없습니다.
  • 또한 Kafka는 기본적으로 메시지를 "소비자"가 읽을 때까지 영구적으로 저장하는데, 이 점에서 전통적인 메시지 큐와는 다르게 메시지 처리 및 삭제 정책을 정확히 설정해야 합니다.

3. 높은 하드웨어 자원 요구

  • Kafka는 디스크 I/O를 많이 사용하고, 높은 메시지 처리량을 유지하기 위해서는 빠른 디스크와 네트워크 자원이 필요합니다.
  • 특히, 대규모 클러스터에서 실행되는 경우 메모리와 CPU, 디스크 용량을 충분히 확보해야 하며, 이는 하드웨어 비용운영 비용을 높이는 요소가 될 수 있습니다.

4. 메시지 소비 지연 문제

  • Kafka는 데이터를 "즉시" 처리하는 실시간 스트리밍 시스템으로 설계되었지만, 때때로 소비자가 데이터 소비를 즉시하지 못할 경우 데이터가 축적될 수 있습니다.
  • 파티션 리더의 부하나 소비자 그룹에서의 불균형, 네트워크 지연 등으로 인해 메시지 지연이나 처리 속도 저하가 발생할 수 있습니다.

5. 대용량 데이터의 관리와 모니터링

  • Kafka는 대규모 데이터를 처리할 수 있지만, 이 데이터를 관리하고 모니터링하는 것은 까다로울 수 있습니다. Kafka 클러스터에 저장된 데이터가 많아질수록 복잡한 데이터 관리모니터링 도구가 필요합니다.
  • 특히 데이터 보존 기간(Log retention policy) 설정을 잘못하면 디스크 공간 부족 등의 문제가 발생할 수 있습니다.

6. 메시지의 중복 처리 문제

  • Kafka는 기본적으로 at least once 메시지 전달 보장을 제공하지만, 네트워크 장애나 서버 실패 등으로 인해 메시지가 중복되어 처리될 수 있습니다. 이 경우 애플리케이션에서 중복 처리를 방지하는 로직을 추가해야 할 필요가 있습니다.

7. 일관성 있는 데이터 처리 어려움

  • Kafka는 메시지의 순차적 처리를 보장하지만, 여러 소비자가 동일한 데이터를 동시에 읽을 때 발생할 수 있는 데이터 일관성 문제를 해결하는 것은 추가적인 설계가 필요합니다. 예를 들어, 여러 소비자가 메시지를 처리할 때 동시성 문제를 고려해야 합니다.

8. 데이터 변경 처리 어려움

  • Kafka는 불변성(immutability)을 기준으로 작동하며, 주로 로그형 데이터 처리에 강점을 보입니다. 그러나 데이터가 변경되는 경우(예: 상태 업데이트 등) 처리하는 방식이 다소 불편할 수 있습니다.
  • 예를 들어, 데이터에 변경 사항이 있을 때 Kafka가 이를 효율적으로 처리하려면 특별한 설계가 필요하고, 로그 로그형 메시징 시스템에서 상태 관리 시스템으로의 확장은 추가적인 구현 노력이 필요합니다.

Kafka의 구성 요소:

  1. Producer (생산자): 데이터를 생성하여 Kafka로 전송하는 역할을 합니다. 예를 들어, 웹 서버나 애플리케이션에서 생성한 데이터를 Kafka로 보낼 수 있습니다.
  2. Consumer (소비자): Kafka에서 데이터를 받아서 처리하는 역할을 합니다. 여러 소비자가 동시에 데이터를 처리할 수 있습니다.
  3. Broker (브로커): Kafka 클러스터를 구성하는 서버들로, 메시지를 저장하고, Producer와 Consumer 간의 메시지를 전달하는 역할을 합니다. 여러 개의 브로커가 클러스터를 이루어 고가용성을 제공합니다.
  4. Topic (토픽): 메시지를 분류하는 기준이 되는 카테고리입니다. Producer는 특정 토픽으로 메시지를 보내고, Consumer는 해당 토픽에서 메시지를 소비합니다. 토픽은 여러 파티션으로 나뉘어 메시지를 분산 저장할 수 있습니다.
  5. Partition (파티션): Kafka는 데이터의 분산 처리와 병렬 처리를 위해 각 토픽을 여러 파티션으로 나눠서 저장합니다. 각 파티션은 독립적으로 처리할 수 있으며, 데이터를 병렬로 처리할 수 있게 해줍니다.
  6. Zookeeper: Kafka 클러스터의 메타데이터 관리와 클러스터 상태를 유지하는 데 사용됩니다. 다만, 최근 Kafka는 Zookeeper 없이도 운영할 수 있도록 발전해 왔습니다.

Kafka의 사용 사례:

  1. 실시간 로그 수집: 서버나 애플리케이션에서 발생하는 로그를 실시간으로 수집하고 분석할 때 Kafka를 사용할 수 있습니다.
  2. 실시간 데이터 파이프라인: 다양한 시스템 간의 데이터를 실시간으로 전달하거나 처리할 때 유용합니다. 예를 들어, 데이터를 실시간으로 수집하여 분석 시스템으로 전달하는 경우에 사용됩니다.
  3. 이벤트 기반 시스템: Kafka는 이벤트 스트리밍 시스템으로도 활용됩니다. 이벤트가 발생할 때마다 이를 Kafka에 기록하고, 이를 통해 다양한 애플리케이션에서 이벤트를 처리할 수 있습니다.
  4. 데이터 통합: 서로 다른 시스템에서 발생하는 데이터를 Kafka를 통해 통합하여 실시간으로 처리하거나 저장할 수 있습니다.

Kafka와 개발 언어:

Kafka는 자체적인 프로그래밍 언어가 아니라, 여러 애플리케이션과 시스템을 연결하고, 데이터를 처리하는 인프라 구성 요소로 사용됩니다. Kafka는 분산 시스템이기 때문에 여러 서버에 분산되어 동작하며, 높은 처리 성능과 내구성을 제공합니다.

Kafka를 사용하여 애플리케이션을 개발하려면, Kafka 클러스터와 통신할 수 있는 클라이언트 라이브러리를 사용해야 합니다. 이를 통해 다양한 프로그래밍 언어에서 Kafka와 연동할 수 있습니다. 예를 들어:

  • Java: Kafka는 Java로 구현되어 있기 때문에, Java 애플리케이션에서 Kafka를 직접 사용할 수 있습니다.
  • Python: kafka-python과 같은 라이브러리를 사용하여 Python에서 Kafka를 사용할 수 있습니다.
  • C#: .NET 환경에서도 Kafka 클라이언트를 통해 Kafka를 사용할 수 있습니다.
  • Go, Node.js 등: 다른 언어에도 Kafka 클라이언트 라이브러리가 제공됩니다.