GETTING STARTED
Introduction
What is event streaming?
이벤트 스트리밍은 사람의 중추 신경계에 해당하는 디지털 방식이다. 비즈니스가 소프트웨어로 정의되고 자동화되어있고 소프트웨어의 사용자는 더 많은 소프트웨어인 인터넷에 상시 접속된 세상의 기술적 토대이다.
기술적으로 이야기하자면, 이벤트 스트리밍은 데이터를 캡쳐하는 관행이다. 데이터베이스, 센서, 모바일 디바이스, 클라우드 서비스, 소프트웨어 애플리케이션과 같은 이벤트 소스로부터 이벤트의 스트림 형태로 값을 캡쳐하는. 이러한 이벤트는 나중에 검색할 수 있도록 지속적으로 저장한다; 실시간 및 나중에 이벤트 스트림으로의 복제, 프로세싱, 반응; 그리고 이벤트 스트림을 다른 필요한 목적지로 라우팅 한다. 이벤트 스트리밍은 따라서 지속적인 플로우와 데이터의 인터프리테이션을 보장한다. 그러므로 올바른 정보가 올바른 장소에, 올바른 시간을 보장한다.
What can I use event streaming for?
이벤트 스트리밍은 수 많은 산업체와 조직에 매우 다양한 유스 케이스로 적용되었다. 예시는 다음과 같다:
- 주식 거래, 금융 그리고 보험과 같은 실시간 결제 및 금융적인 트랜잭션을 처리할 때
- 화물이나 자동차 산업의 자동차, 트럭, 차량 및 배송을 추적하고 모니터링할 때
- 공장이나 풍력 발전소와 같이 IoT 디바이스나 기타 장비에서 센서데이터를 지속적으로 캡쳐해서 분석하는 경우
- 리테일, 호텔 산업, 모바일 애플리케이션과 같이 고객과 소통/ 주문을 수집/반응하는 경우
- 병원 치료에서 환자를 모니터링하고 상태 변화를 예측하여 응급 상황에서 제때 치료할 수 있게하는 경우
- 다른 회사에서 생성된 접근가능한 데이터를 연결, 저장, 생산하는 경우
- 데이터 플랫폼, event-driven 아키텍쳐, 마이크로 서비스의 파운데이션으로서 수행
Apache Kafka는 이벤트 스트리밍 플랫폼이다. 이것의 의미는?
카프카는 세가지 핵심 기능을 조합하여, 당신이 당신의 유스 케이스를 구현할 수 있게 도와준다. (end-to-end 이벤트 스트리밍 , 싱글 배틀 테스티드 솔루션)
- 스트림 이벤트를 발행/구독하기 위해, 다른 시스템으로부터 지속적으로 당신의 데이터를 import/export
- 이벤트의 스트림을 지속적이고 확실하게 당신이 원하는 만큼 저장
- 이벤트가 발생함으로 이벤트 스트림을 처리하거나, 추후에 처리함
그리고 이 모든 기능들은 분산적으로, 높은 확장성의, 탄력 있게, fault-tolerant, 보안적인 방법으로 진행된다. 카프카는 베어 메탈 하드웨어, 가상 머신, 컨테이너, 온프레미스, 클라우드에서 배포될 수 있다. 당신은 카프카 환경을 셀프매니징하거나 다양한 벤더로부터 제공되는 충분히 매니지된 서비스중에서 선택하면 된다.
Kafka가 nutshell에서 어떻게 동작하는가?
카프카는 서버와 클라이언트를 포함하는 분산 시스템이다, 고성능 TCP 네트워크 프로토콜로 통신하는. 배어 메탈 하드웨어나 가상머신, 온프레미스의 컨테이너, 클라우드에서 배포될 수 있다.
Servers: 카프카는 하나 또는 여러 개의 서버의 클러스터로 실행된다, 여러 데이터 센터 또는 클라우드 지역에 걸쳐 있을 수 있는. 저장소 레이어로부터 여러개의 서버가 형성되며, 브로커라고 불린다. 다른 서버는 Kafka Connect를 실행하여 지속적으로 이벤트 스트림으로서의 데이터를 수입/수출한다. Kafka를 관계형 데이터베이스 및 기타 Kafka 클러스터와 같은 기존 시스템과 통합하기 위해. 미션 크리티컬한 사용 사례를 구현하려면, 카프카 클러스터는 높게 확장 가능하고, 에러에 대응할 수 있어야 한다: 만약 어떤 서버가 죽으면, 다른 서버들이 그들의 일을 수행하여 지속적인 연산을 데이터 손실 없이 보장해야 한다.
Client: 그들은 당신이 분산 애플리케이션과 마이크로 서비스에 작성하는 것을 허용한다, 그 서비스들은 읽고, 쓰고, 처리한다 이벤트의 스트림을 병렬적이고 대규모로, 장애에 내성을 가지는 방법으로, 심지어 네트워크 문제나 장비 문제에도. 카프카는 일부 몇 고객사들을 포함하여 전송한다, 카프카 커뮤니티에 존재하는 수십 개의 클라이언트에 의해 보강된다. 클라이언트는 자바나 스칼라 등에 고레벨 카프카 스트림 라이브러리를 제공하고, GO, Python, C/C++ 그리고 다른 많은 언어들에 Rest API를 제공한다.
Main Concept and Terminology
하나의 이벤트는 무언가가 발생했다는 사실을 세상이나 당신의 비즈니스에 기록한다. 이것은 또한 문서에서 레코드나 메시지로 부른다. 당신이 Kafka에서 데이터를 읽거나 쓸 때, 이벤트의 형태로 하게 된다. 개념적으로, 이벤트는 key, value, timestamp, optional metadata headers를 가진다. 여기에 예제가 있다.
- Event key: "Alice"
- Event value: "Made a payment of $200 to Bob"
- Event timestamp: "Jun. 25, 2020 at 2:06 p.m."
- **발행자(Producers)**는 클라이언트 애플리케이션이다 카프카에 이벤트를 발행하는, 그리고 **소비자(Consumers)**는 그러한 이벤트를 읽고 처리하는 구독하는 사람들이다. Kafka에서 생산자와 소비자는 완전히 분리되고 서로에 대해서 모른다, 이것은 카프카에서 사용 중인, 높은 가용성을 얻기 위해 핵심 디자인 요소이다. 예를 들어, 생산자는 소비자를 기다릴 필요가 없다. Kafka는 이벤트 처리를 정확히 한 번만 처리하는 능력과 같은 다양한 보장을 제공한다.
이벤트들은 조직되어 **토픽(topic)**에 지속적으로 저장된다. 매우 단순하게 말하자면, 토픽은 파일 시스템의 폴더와 비슷하고, 이벤트들은 폴더 안의 파일이다. 예제 토픽의 이름을 payments라고 하자. Kafka의 토픽들은 항상 multi-producer와 multi-subscriber이다: 토픽은 0,1, 또는 많은 프로듀서를 가진다, 이벤트를 토픽에 작성할 수 있는, 토픽의 이벤트를 구독하는 0,1, 또는 많은 소비자를 가질 수 있는 것처럼. 토픽의 이벤트들은 그들이 원하는 만큼 읽힐 수 있다 - 전통적인 메시징 시스템들과 다르게, 이벤트들은 소비 후에 지워지지 않을 수 있다. 대신에, 당신은 kafka가 얼마나 오랫동안 이벤트를 보유할지 정의해야 한다, 토픽당 환결 설정을 세팅, 오래된 이벤트가 삭제되도록 한다. kafka의 성능은 효율적으로 일정하다, 데이터 사이즈에 따라 , 그래서 오랜 시간 데이터를 저장하는 것은 완벽하다.
토픽들은 파티션 된다(partitioned), 이것은 토픽들이 다른 kafka 브로커(broker)에 위치한 수많은 바구니로 퍼지는 것을 의미한다. 이 당신의 데이터가 분산된 장소는 확장성에서 매우 중요하다, 왜냐하면 이것은 클라이언트 애플리케이션이 읽고 쓰기를 많은 브로커들과 동시에 할 수 있게 해 주기 때문이다. 새로운 이벤트가 토픽에 발행되었을 때, 이것은 토픽의 파티션 중 하나에 실제로 추가된다. 같은 이벤트 키를 가지는 이벤트들은 같은 파티션에 쓰이고, Kafka는 보장한다. 주어진 토픽 파티션의 어떤 소비자가 항상 파티션의 이벤트를 읽도록, 정확히 쓰인 같은 순서로
당신의 데이터가 장애에 내성을 가지면서 고가용성을 가지려면, 모든 토픽은 복제될 수 있어야 한다, 지리적 지역 또는 데이터 센터에 걸쳐서도, 그래서 문제가 생겼을 때를 대비해 항상 여러 개의 데이터의 사본을 가지고 있는 여러개의 중개인과 기타 등등을 유지해야 한다. 일반적인 생산 설정은 3의 replication 수치를 주는 것이다. 이것은 당신의 데이터가 3개의 사본을 항상 가지는 것이다. 이러한 복제는 토픽-파티션의 레벨에서 수행된다.
이 입문서는 소개로 충분해야 한다. docs의 Design 섹션에서 Kafka의 다양한 콘셉트에 대해 모든 디테일로 설명한다, 당신이 관심이 있다면.
Kafka APIs
관리와 admin tasks를 위한 커맨드 라인 도구에 추가적으로, Kafka는 자바와 스칼라로 작성된 5가지 핵심 API들을 제공한다.
- Admin API: 토픽, 중개인과 기타 Kafka 오브젝트들을 관리, 조사한다.
- Producer API: 하나 또는 이상의 Kafa 토픽들에 대해 이벤트 스트림을 발행한다
- Consumer API: 하나 또는 이상의 토픽을 일고 이벤트의 스트림을 처리한다.
- Kafka Streams API: 스트림 처리 애플리케이션과 마이크로 서비스 구현을 위한 API. 높은 수준의 함수들을 제공한다. 이벤트 스트림들을 처리하고, 변환하고, aggregation, join, windowing, 이벤트 타임에 기반한 처리, 등등과 같은 상태 있는 연산을 처리할 수 있다. 입력값은 하나 또는 이상의 토픽을 읽어오는 것, 하나 또는 그 이상의 토픽을 생성하기 위해, 효과적으로 입력 스트림에서 출력 스트림으로 변환해준다.
- Kafka Connect API: 재사용 가능한 데이터 수입/수출 커넥터를 빌드하고 실행할 수 있다. 커넥터는 외부의 시스템과 애플리케이션으로의 이벤트의 스트림을 쓰고, 읽을 수 있으며, 그러므로 kafka로 통합될 수 있다. 예를 들면, 커넥터는 PostgreSQL과 같은 관계형 데이터베이스에 모든 테이블의 집합에 모든 변화를 캡쳐할 것이다. 그러나, 실제로, 당신은 전형적으로 당신의 개인 커넥터를 필요로 하지 않는다, 왜냐하면 Kafka 커뮤니티에서 이미 수백개의 사용가능한 커넥터를 제공하기 때문에. → 즉 실제로 Connect API를 사용하여 실제로 Connector를 작성하게 될 일은 거의 없을 것이다.
여기서 어디로 가야 하는가
- Kafka에 대한 실무경험을 쌓고 싶으면, Quickstart로 가라.
- 더 이해하고 싶으면, Documentation을 읽어라. 또는 카프카 책이나 논문들도 있다.
- Use case들을 살펴보고 , 다른 사용자가 어떻게 카프카에서 가치를 얻는지 전 세계 커뮤니티에서 배우자.
- 로컬 Kafka 모임에 참석하고, Kafka Summit talk(카프카 커뮤니티의 메인 컨퍼런스)을 시청하라.