Kafka 소개
Kafka 소개 (Introduction)
Kafka가 무엇인지, 왜 '이벤트 스트리밍 플랫폼'이라고 부르는지 개념부터 차근차근 설명하는 문서예요. 이벤트 스트리밍이 뭔지, Kafka가 어떤 문제를 푸는지, 핵심 개념(토픽·파티션·프로듀서·컨슈머)을 잡는 데 좋은 첫걸음이에요.
출처: 문서
본문
이벤트 스트리밍이란? (What is event streaming?)
이벤트 스트리밍(event streaming)은 인간 신체의 중추 신경계에 해당하는 디지털 버전이라고 할 수 있어요. 비즈니스가 점점 소프트웨어로 정의되고 자동화되며 소프트웨어의 사용자가 더 많은 소프트웨어가 되어가는 '항상 켜져 있는(always-on)' 세계의 기술적 토대예요.
기술적으로 말하면, 이벤트 스트리밍은 데이터베이스, 센서, 모바일 기기, 클라우드 서비스, 소프트웨어 애플리케이션 같은 이벤트 소스에서 이벤트 스트림 형태로 데이터를 실시간으로 포착하고, 그 이벤트 스트림을 나중에 검색할 수 있도록 내구성 있게 저장하며, 실시간으로 그리고 회고적으로도 이벤트 스트림을 조작·처리·반응하고, 필요에 따라 서로 다른 목적지 기술로 이벤트 스트림을 라우팅하는 관행이에요. 이렇게 이벤트 스트리밍은 데이터의 연속적인 흐름과 해석을 보장해서, 올바른 정보가 올바른 시기에 올바른 곳에 있도록 해줘요.
이벤트 스트리밍은 어디에 쓸 수 있나요?
이벤트 스트리밍은 정말 다양한 산업과 조직에서 폭넓은 활용 사례에 적용돼요. 그 예로는 다음이 있어요.
- 주식 거래소, 은행, 보험처럼 결제와 금융 거래를 실시간으로 처리하는 경우
- 물류와 자동차 산업처럼 차량, 트럭, 차량대, 화물을 실시간으로 추적·모니터링하는 경우
- 공장이나 풍력 단지처럼 IoT 기기나 기타 장비의 센서 데이터를 지속적으로 포착·분석하는 경우
- 소매, 호텔·여행 업계, 모바일 앱처럼 고객 상호작용과 주문을 수집하고 즉시 반응하는 경우
- 병원 치료 중 환자를 모니터링하고 상태 변화를 예측해 응급 상황에서 적시에 치료를 보장하는 경우
- 회사의 여러 부서가 만든 데이터를 연결·저장·제공하는 경우
- 데이터 플랫폼, 이벤트 기반 아키텍처, 마이크로서비스의 기반으로 쓰는 경우
Apache Kafka®는 이벤트 스트리밍 플랫폼이에요. 그게 무슨 뜻일까요?
Kafka는 세 가지 핵심 역량을 결합해서 이벤트 스트리밍 활용 사례를 단일한 검증된 솔루션으로 처음부터 끝까지(end-to-end) 구현하게 해줘요.
- 이벤트 스트림을 발행(쓰기)하고 구독(읽기)하는 기능 — 다른 시스템에서 데이터를 지속적으로 가져오고 내보내는 것 포함
- 이벤트 스트림을 원하는 만큼 내구성 있게(factually, reliably) 저장하는 기능
- 이벤트 스트림을 발생 시점이나 회고적으로 처리하는 기능
그리고 이 모든 기능은 분산적이고, 고도로 확장 가능하며, 탄력적이고, 장애 허용적이고, 안전한 방식으로 제공돼요. Kafka는 베어메탈 하드웨어, 가상 머신, 컨테이너에서, 그리고 온프레미스와 클라우드 양쪽에서 배포할 수 있어요. Kafka 환경을 직접 관리(self-managing)하거나 다양한 벤더가 제공하는 완전 관리형(fully managed) 서비스를 사용하는 선택지가 있어요.
Kafka는 한마디로 어떻게 동작할까요?
Kafka는 고성능 TCP 네트워크 프로토콜로 통신하는 서버와 클라이언트로 구성된 분산 시스템이에요. 온프레미스와 클라우드 환경 모두에서 베어메탈 하드웨어, 가상 머신, 컨테이너에 배포할 수 있어요.
- 서버(Server): Kafka는 여러 데이터센터나 클라우드 리전에 걸칠 수 있는 하나 이상의 서버 클러스터로 실행돼요. 이 중 일부 서버는 저장 계층을 이루는데, 이를 브로커(broker) 라고 불러요. 다른 서버는 Kafka Connect를 실행해서 이벤트 스트림으로 데이터를 지속적으로 가져오고 내보내며 관계형 데이터베이스 같은 기존 시스템이나 다른 Kafka 클러스터와 통합해요. 미션 크리티컬한 활용 사례를 지원하기 위해 Kafka 클러스터는 고도로 확장 가능하고 장애 허용적이에요 — 서버 하나가 실패하면 다른 서버가 그 작업을 넘겨받아 데이터 손실 없이 지속적으로 운영돼요.
- 클라이언트(Client): 이벤트 스트림을 병렬로, 대규모로, 그리고 네트워크 문제나 머신 장애가 있어도 장애 허용적으로 읽고 쓰고 처리하는 분산 애플리케이션과 마이크로서비스를 작성할 수 있게 해줘요. Kafka는 그런 클라이언트 일부를 기본 포함하며, 여기에 Kafka 커뮤니티가 제공하는 수십 개의 클라이언트가 더해져요 — Java와 Scala(고수준의 Kafka Streams 라이브러리 포함), Go, Python, C/C++, 그리고 많은 다른 프로그래밍 언어와 REST API용 클라이언트가 있어요.
주요 개념과 용어 (Main Concepts and Terminology)
이벤트(event) 는 세상이나 비즈니스에서 "무언가 일어났다"는 사실을 기록해요. 문서에서는 레코드(record)나 메시지(message)라고도 불러요. Kafka에 데이터를 읽거나 쓸 때는 이벤트 형태로 해요. 개념적으로 이벤트는 키(key), 값(value), 타임스탬프(timestamp), 그리고 선택적인 메타데이터 헤더(header)를 가져요. 예시 이벤트를 볼게요.
- 이벤트 키: "Alice"
- 이벤트 값: "Bob에게 $200 결제를 했다" (Made a payment of $200 to Bob)
- 이벤트 타임스탬프: "2020년 6월 25일 오후 2시 6분"
프로듀서(producer) 는 이벤트를 Kafka에 발행(쓰기)하는 클라이언트 애플리케이션이고, 컨슈머(consumer) 는 이벤트를 구독(읽고 처리)하는 쪽이에요. Kafka에서 프로듀서와 컨슈머는 완전히 분리되어 서로를 알 필요가 없어요. 이는 Kafka가 유명한 높은 확장성을 달성하는 핵심 설계 요소예요. 예를 들어 프로듀서는 컨슈머를 절대 기다릴 필요가 없어요. Kafka는 이벤트를 정확히 한 번(exactly-once) 처리하는 능력 같은 다양한 보증(guarantees)을 제공해요.
이벤트는 토픽(topic) 으로 정리되어 내구성 있게 저장돼요. 매우 단순하게 말하면 토픽은 파일시스템의 폴더와 비슷하고, 이벤트는 그 폴더 안의 파일이라고 볼 수 있어요. 예시 토픽 이름은 "payments"가 될 수 있어요. Kafka의 토픽은 항상 다중 프로듀서·다중 구독자(multi-producer, multi-subscriber)예요 — 토픽에는 이벤트를 쓰는 프로듀서가 0개, 1개, 여러 개 있을 수 있고, 이벤트를 구독하는 컨슈머도 0개, 1개, 여러 개 있을 수 있어요. 토픽의 이벤트는 필요한 만큼 반복해서 읽을 수 있어요 — 전통적인 메시징 시스템과 달리, 컨슈머가 소비한 뒤에도 이벤트가 삭제되지 않아요. 대신 토픽별 설정으로 Kafka가 이벤트를 얼마나 오래 보존할지를 정하고, 그 기간이 지나면 오래된 이벤트를 버려요. Kafka의 성능은 사실상 데이터 크기에 대해 일정하므로, 데이터를 오래 저장해도 전혀 문제없어요.
토픽은 파티셔닝(partitioned) 돼요. 즉 토픽이 서로 다른 Kafka 브로커에 위치한 여러 "버킷(bucket)"으로 펼쳐져요. 데이터의 이런 분산 배치는 확장성에 매우 중요한데, 클라이언트 애플리케이션이 동시에 여러 브로커에서 데이터를 읽고 쓸 수 있기 때문이에요. 새 이벤트가 토픽에 발행되면 실제로는 토픽의 파티션 중 하나에 추가돼요. 같은 이벤트 키(예: 고객 ID나 차량 ID)를 가진 이벤트는 같은 파티션에 쓰여지고, Kafka는 특정 토픽-파티션의 어떤 컨슈머든 그 파티션의 이벤트를 쓰여진 순서 그대로 항상 읽는다고 보장해요.
그림 설명: 이 예시 토픽은 4개의 파티션 P1-P4를 가져요. 두 다른 프로듀서 클라이언트가 서로 독립적으로 네트워크를 통해 토픽의 파티션에 새 이벤트를 쓰며 발행해요. 같은 키를 가진 이벤트(그림에서 색으로 표시)는 같은 파티션에 쓰여져요. 두 프로듀서가 적절하다면 같은 파티션에 쓸 수도 있다는 점을 참고해요.
데이터를 장애 허용적이고 고가용성으로 만들기 위해 모든 토픽은 지리적 리전이나 데이터센터를 넘어서도 복제(replicated) 될 수 있어요. 그래서 항상 데이터 사본을 가진 브로커가 여러 개 있어서, 문제가 생기거나 브로커 유지보수를 해야 할 때 대비할 수 있어요. 일반적인 프로덕션 설정은 복제 팩터(replication factor) 3, 즉 데이터의 사본이 항상 3개 있는 거예요. 이 복제는 토픽-파티션 단위로 수행돼요.
이 정도면 소개로 충분해요. 문서의 Design 섹션이 Kafka의 다양한 개념을 아주 자세히 설명하니까, 관심이 있다면 그쪽을 보면 돼요.
Kafka API
관리·운영 작업용 커맨드라인 도구 외에도, Kafka는 Java와 Scala용 핵심 API 5가지를 제공해요.
- Admin API — 토픽, 브로커, 그리고 그 밖의 Kafka 객체를 관리하고 점검해요.
- Producer API — 하나 이상의 Kafka 토픽에 이벤트 스트림을 발행(쓰기)해요.
- Consumer API — 하나 이상의 토픽을 구독(읽기)하고 그 토픽에 생산된 이벤트 스트림을 처리해요.
- Kafka Streams API — 스트림 처리 애플리케이션과 마이크로서비스를 구현해요. 이벤트 스트림을 처리하는 고수준 함수(변환, 집계·조인 같은 상태 저장 연산, 윈도잉, 이벤트 시간 기반 처리 등)를 제공해요. 하나 이상의 토픽에서 입력을 읽어 하나 이상의 토픽으로 출력을 생성해, 실질적으로 입력 스트림을 출력 스트림으로 변환해요.
- Kafka Connect API — 외부 시스템·애플리케이션과 Kafka 사이에서 이벤트 스트림을 소비(읽기)하거나 생산(쓰기)하는 재사용 가능한 데이터 수입/수출 커넥터를 만들고 실행해요. 예를 들어 PostgreSQL 같은 관계형 데이터베이스용 커넥터는 테이블 집합의 모든 변경을 포착할 수 있어요. 다만 실무에서는 보통 직접 커넥터를 구현할 필요가 없어요 — Kafka 커뮤니티가 이미 수백 개의 즉시 사용 가능한 커넥터를 제공하거든요.
여기서 어디로 가야 할까요?
- Kafka를 직접 경험해 보고 싶다면 Quickstart를 따라 해보세요.
- Kafka를 더 자세히 이해하고 싶다면 Documentation을 읽어보세요. Kafka에 관한 책과 학술 논문 중에서도 선택할 수 있어요.
- Use Cases를 둘러보며 전 세계 커뮤니티의 다른 사용자들이 Kafka에서 어떻게 가치를 얻는지 배워보세요.
- 현지 Kafka 밋업 그룹에 참여하고, Kafka 커뮤니티의 주요 컨퍼런스인 Kafka Summit 발표를 시청해 보세요.
더 알아보기 (Learn more)
- Kafka의 핵심은 토픽(폴더 같은 저장소)과 파티션(병렬 처리 단위), 그리고 프로듀서·컨슈머의 분리예요.
- 이벤트는 '무언가 일어났다'는 사실의 기록이며, 토픽에 내구성 있게 저장되고 필요한 만큼 반복해서 읽을 수 있어요.