카프카와 이벤트 스트리밍의 정의
카프카란, 아파치 재단에서 지원하는 이벤트 스트리밍 플랫폼이다.
이벤트 스트리밍이란 데이터 베이스, 모바일 디바이스, 클라우드 서비스 등 소프트웨어 어플리케이션에서 발생하는 이벤트에 대해 스트림 형식으로 실시간으로 데이터를 캡쳐하는 것을 말한다.
나중에 검색할 수 있도록 이러한 이벤트 스트림을 지속적으로 저장해서, 적시적소에 데이터를 제공한다.
온 프레미스 및 클라우드 환경의 가상 머신 및 컨테이너에 배포할 수 있으며
자체 환경을 구성해서 관리하는 방법과 다양한 공급업체(ex AWS)에서 제공하는 관리서비스 중에 선택 가능하다.
우리가 일상에서 볼 수 있는 많은 기능들이 실제로 이벤트 스트리밍으로 구성되어 있다.
아래 예시를 보자.
- 증권 거래소, 은행, 보험 등에서 실시간으로 결제 및 금융 거래를 처리하는 것
- 물류 및 자동차 산업에서 실시간으로 자동차, 트럭, 차량 및 배송을 추적하고 모니터링하는 것
- 병원 치료에서 환자를 모니터링하고 상태 변화를 예측하여 응급 상황에서 적시에 치료할 수 있도록하는 것
- 데이터 플랫폼, 이벤트 기반 아키텍처 및 마이크로 서비스의 기반 역할
카프카 특징
카프카는 특징적인 세가지 주요기능을 결합해 이벤트 스트리밍 솔루션을 제공한다.
- 1. 다른 시스템에서 데이터의 지속적인 이벤트 스트림을 publish(write, 쓰기) 및 subcribe(read, 구독)한다.
- 2. 원하는 기간동안 지속적으로 이벤트 스트림을 store(저장)한다.
- 3. 이벤트를 소급 process(처리)한다.
카프카의 작동원리
카프카는 고성능 TCP 네트워크 프로토콜을 통해 통신하는 server(서버)와 client(사용자)로 구성된 분산 시스템이다.
Servers
카프카는 여러개의 데이터 센터 또는 클라우드 리전에 접해있는 하나 이상의 서버 클러스터로 실행된다.
이러한 서버 중 일부는 브로커라고 하는 스토리지 계층을 형성한다.
다른 서버는 Kafka Connect를 실행하여 지속적으로 데이터를 이벤트 스트림으로 가져오고 내보내서 관계형 데이터베이스 및 기타 카프카 클러스터와 같은 기존 시스템과 통합한다.
또한, 카프카 클러스터는 확장성이 뛰어나고 내결함성이 높다.
서버 중 하나에 장애가 발생하면 다른 서버가 데이터 손실없이 지속적인 운영을 보장하기 위해 작업을 인계받아 실행하기 때문이다.
Clients
네트워크 문제 또는 머신 장애가 발생하는 경우에도 내결함 방식으로 사용자는 이벤트를 읽고 쓰고 처리하는 분산 어플리케이션 및 마이크로 서비스를 구성할 수 있다. 현재, Go, Python, C, Java 등 다양한 언어로 카프카를 사용할 수 있다.
주요 개념 및 용어
Event
카프카에서 이벤트랑 특정 요청이 발생한 것을 의미한다.
레코드나 메세지로도 말하기도 한다.
우리가 카프카에 데이터를 읽고 쓸때 해당 이벤트 폼을 사용할 수 있다.
이벤트는 key, value, timestamp 그리고 옵션값으로 metadata header로 구성된다.
아래 예시를 참고하자.
- Event key: "Alice"
- Event value: "Made a payment of $200 to Bob"
- Event timestamp: "Jun. 25, 2020 at 2:06 p.m."
Producers
카프카에서 producer란 카프카에 이벤트를 작성하는 클라이언트 어플리케이션을 뜻한다.
Consumers
consumer 들은 producer가 올린 이벤트들을 읽고 처리한다.
카프카에서 프로듀서 그리고 컨슈머는 완전히 분리된다.
이는 카프카의 높은 확장성을 달성하기 위한 핵심 디자인 요소이다.
따라서 이벤트를 제공하는 프로듀서는 컨슈머를 기다릴 필요가 없다.
프로듀서가 일일이 기다려서 이벤트를 전달하지 않더라도 카프카는 이벤트를 정확히 한 번만 처리하는 기능을 보증해준다.
Topics
이벤트는 토픽이라는 곳에 지속적으로 저장된다.
토픽은 매우 심플하게 구성되어 있는데 파일시스템안에 있는 폴더와 유사한 구조를 가지고 있다.
즉, 토픽은 폴더 이벤트는 해당 폴더안에 파일이라고 생각하면 된다.
토픽은 다중 프로듀서와 다중 컨슈머로 이루어질 수 있다.
1명의 프로듀서와 여러명의 컨슈머 혹은 여러명의 프로듀서와 한명의 컨슈머로 다양하게 구성 가능하다.
토픽안에 있는 이벤트는 필요한만큼 자주 읽을 수 있으며, 기존 메시징 시스템과 달리 이벤트는 제공된 후 삭제되지 않는다.
대신 카프카가 주제별 구성 설정을 통해 이벤트를 유지해야하는 기간을 정의한다.
이벤트는 해당 기간이 지나면 자동으로 삭제된다.
카프카는 데이터 사이즈를 효율적으로 유지하기 때문에 데이터를 오랜시간 저장할 수 있다.
Partitioned
토픽은 서로 다른 카프카 브로커에 있는 여러 buckets 에 분산되어 있다.
데이터의 분산 배치는 클라이언트 애플리케이션이 동시에 여러 브로커에서 데이터를 읽고 쓸 수 있도록 하므로 확장성이 매우 중요하다.
새 이벤트가 토픽에 게시되면 실제로 토픽의 파티션 중 하나에 추가된다.
동일한 이벤트 키 (예 : 고객 또는 차량 ID)를 가진 이벤트는 동일한 파티션에 추가된다.
그리고, 카프카는 주어진 토픽 파티션에 이벤트가 쓰여진 순서대로 컨슈머가 해당 파티션의 이벤트를 읽도록 보장한다.
아래의 예시를 보자.
두명의 서로다른 프로듀서가 각각의 토픽 파티션에 이벤트를 발생시킨다.
동일한 키를 가진 이벤트는 동일한 파티션에 적재된다. 그림에서 보면, 컬러별로 구분되어 있는 것을 알 수 있다.
Replicated
카프카는 데이터를 내결함성 및 고가용성으로 만들기 위해 모든 주제를 복제 할 수 있다.
따라서 문제가 발생할 경우를 대비하여 데이터 사본이 있는 여러 브로커가 항상 존재하고
브로커에 대한 유지 관리 작업을 수행한다.
카프카는 항상 세개의 데이터 사본을 가지고 있고, 이 복제는 토픽 파티션 수준에서 진행된다.
카프카 예제
'Infra > ETC' 카테고리의 다른 글
Message Queue 란? MQ 종류 (2) | 2022.01.15 |
---|---|
[Github] 일명.. 잔디심기 그래프 안 채워지는 경우 (1) | 2021.07.11 |
CORS 처리하기 !! (0) | 2021.05.01 |
[ZooKeeper] 아파치 주키퍼란? (2) | 2021.03.21 |
[Cassandra] 아파치 카산드라란? (0) | 2021.03.18 |