Kafka - Event Streaming Platform
Event Streaming Platform
Kafka를 간단히 설명하면 Event Streaming Platform이다. 그래서 Kafka에 대해서 이해하려면 먼저 Event Streaming Platform이 무엇인지 먼저 이해할 필요가 있다. Kafka 공식 문서에서는 Event Streaming을 다음과 같이 정의한다.
Technically speaking, event streaming is the practice of capturing data in real-time from event sources like databases, sensors, mobile devices, cloud services, and software applications in the form of streams of events; storing these event streams durably for later retrieval; manipulating, processing, and reacting to the event streams in real-time as well as retrospectively; and routing the event streams to different destination technologies as needed. Event streaming thus ensures a continuous flow and interpretation of data so that the right information is at the right place, at the right time.
간단히 요약하면 다양한 비즈니스 로직에서 발생하는 이벤트 데이터들을 적합한 장소에 실시간으로 전달해줄 수 있는 기술을 Event Streaming 이라고 한다. Kafka 는 Event Streaming을 지원하기 위해 세가지 핵심 기능을 제공한다.
- 다른 시스템에서 이벤트를 배포하고(write) 구독할 수 있다(read)
- 사용자가 원할 때 까지 Stream을 견고하게 저장할 수 있다
- Event stream 각각은 발생할 때마다 처리할 게 한다.
그리고 모든 기능은 분산화되고 확장가능하며 장애 복구가 가능하고(Faule Tolerant) 보안이 제공되는 형식이다. 카프카는 순수 하드웨어, 가상 머신, Container에 설치가 가능하다.
Main Concepts and Terminology
Event
비즈니스에서 일어난 어떤 일에 대한 기록이다. Kafka에 데이터를 발행하거나 구독할 때 Event의 형태를 사용하게 된다. 개념적으로 이벤트는 키, 값, 시간, 그리고 추가데이터로 구성된다.
Producers
Kafka에 이벤트를 발행하는 클라이언트 애플리케이션이다.
Consumer
Producer에서 추가한 이벤트를 처리하고 구독하는 주체다 .
Producers - Consumer
Producer와 Consumer는 완전히 분리되는데 이는 Kafka가 높은 확장성을 가질 수 있는 핵심 디자인 요소다. 예로 들면 이렇게 분리된 형태 덕분에 Producer는 Consumer를 기다리지 않고도 새로운 이벤트를 발행 할 수 있게 된다.
Topic
이벤트가 조직화되고 저장되는 장소다. 간단하게 설명하면 파일시스템의 폴더이며 이벤트는 이 폴더 내의 파일로 존재한다. 예로 Topic의 이름은 payments가 될 수 있다. Topic은 내부에 이벤트를 추가할 수 있는 여러개의 Producers를 가질 수 있으며 마찬가지로 이벤트를 구독 할 수 있는 여러개의 Consumer를 가질 수 있다.
Topic은 Partition 돼있는데 여러개의 다른 Kafka broker의 Bucket을 저장할 수 있는 형태로 되있다. 이렇게 분산화된 데이터 저장은 확장성에 매우 중요한데 왜냐하면 클라이언트 애플리케이션이 여러개의 Broker로부터 데이터를 읽고 쓸 수 있게 해주기 때문이다. 새로운 event가 Topic에 추가되면 실제로 Topic의 파티션중 하나에 추가된 것이다. 동일한 이벤트 키를 가진 Event는 동일한 Partition에 기록되며 Kafka는 주어진 topic partition의 Consumer는 반드시 해당하는 Partition의 Event를 읽도록 해 Event가 발행된 순서대로 처리할 수 있게 한다.