Event Driven Architecture(EDA) with Kafka
Event Driven Architecture란?
이벤트 주도 아키텍처(Event Driven Architecture, EDA)는 소프트웨어 시스템을 개발하고 구성하는 접근 방식 중 하나로, 시스템 내에서 발생하는 이벤트에 따라 컴포넌트들이 상호작용하고 응답하는 아키텍처 스타일입니다. 이벤트 주도 아키텍처는 비동기적인 통신과 이벤트 처리를 중심으로 한 구조를 갖습니다.
EDA는 다음과 같은 특징을 가지고 있습니다.
- 비동기성: EDA는 이벤트를 비동기적으로 처리합니다. 이벤트 발생 시점에 빠르게 응답하고, 이벤트를 순차적으로 처리하는 것이 아니라 동시에 여러 이벤트를 다룰 수 있습니다.
- 루즈 커플링: 이벤트 주도 아키텍처는 컴포넌트들 간의 강력한 의존성을 피하도록 도와줍니다. 각 컴포넌트는 이벤트를 통해 상호작용하므로, 컴포넌트 간의 결합도가 낮아집니다.
- 확장성: 새로운 기능을 추가하거나 시스템을 확장할 때, 각 컴포넌트를 개별적으로 조정하거나 확장할 수 있습니다. 이벤트 주도 아키텍처는 분산 시스템과 함께 사용되어 확장성을 갖출 수 있습니다.
- 물리적 분리: 서로 다른 위치나 서버에서 실행되는 컴포넌트들 간의 통신이 중요한 경우, EDA를 활용하여 이벤트를 이용한 비동기 통신을 구현할 수 있습니다.
- 복잡한 비즈니스 로직 처리: 복잡한 비즈니스 시나리오나 프로세스를 처리하기에 적합합니다. 각각의 단순한 컴포넌트들이 이벤트를 주고받으며 복잡한 로직을 구현할 수 있습니다.
EDA를 사용하는 시스템에서, 이벤트 발생자(Event Producer)가 이벤트를 생성하고, 이를 이벤트 버스(Event Bus)나 브로커를 통해 다른 컴포넌트들에게 전달합니다. 이벤트 수신자(Event Consumer)들은 이벤트를 감지하고 적절한 응답을 수행합니다. 이런 방식으로 컴포넌트 간의 상호작용이 이루어집니다.
예를 들어, 온라인 상점 시스템에서 주문이 들어오면 주문 생성 이벤트가 발생하고, 이를 수신하는 결제 처리 컴포넌트와 재고 관리 컴포넌트가 이벤트를 처리하여 주문 처리를 완료하는 식으로 동작할 수 있습니다.
EDA는 복잡한 시스템에서 유연하고 확장 가능한 아키텍처를 구성하는데 도움이 되며, 현대적인 분산 시스템의 설계에 널리 사용되는 패턴 중 하나입니다.
Kafka란?
Kafka는 분산 스트리밍 플랫폼으로, 대용량의 데이터 스트림을 처리하고 저장하기 위한 오픈 소스 솔루션입니다. 아파치 카프카(Apache Kafka)라고도 불립니다. Kafka는 LinkedIn에서 개발된 이후 아파치 소프트웨어 재단에 기증되어 오픈 소스 프로젝트로 발전하였습니다.
Kafka의 주요 목표는 실시간 데이터 스트리밍을 지원하며, 대용량 데이터를 높은 처리량으로 수집, 저장, 처리할 수 있는 기능을 제공하는 것입니다. Kafka는 다음과 같은 특징을 가지고 있습니다.
- 분산 아키텍처: Kafka는 분산 환경에서 동작하도록 설계되었습니다. 데이터를 여러 브로커로 나눠 저장하고 관리함으로써 확장성과 내결함성을 제공합니다.
- 토픽과 파티션: 데이터를 토픽(topic) 단위로 구분하며, 각 토픽은 여러 파티션(partition)으로 나눠집니다. 이렇게 나눠진 데이터는 여러 브로커에 분산 저장됩니다.
- 높은 처리량: Kafka는 초당 수백만 개의 이벤트를 처리할 수 있는 높은 처리량을 제공합니다. 이는 데이터를 빠르게 수집하고 분배할 수 있는 장점을 가집니다.
- 내결함성: 브로커 중 하나가 고장 나더라도 데이터의 유실 없이 서비스를 유지할 수 있도록 내결함성 기능을 제공합니다.
- 유연한 유지 관리: 데이터는 특정 기간동안 보관되며, 소비자가 원하는 시점에 데이터를 읽을 수 있습니다. 이를 통해 데이터 유지 관리 및 복구가 용이합니다.
- 스트림 처리: Kafka는 데이터 스트림을 처리하고 다른 시스템으로 전달할 수 있는 기능을 제공하며, 스트림 처리 애플리케이션과의 통합을 지원합니다.
Kafka는 다양한 사용 사례를 갖고 있습니다. 예를 들어, 로그 데이터 수집, 이벤트 로깅, 실시간 분석, 모니터링, 웹사이트 액티비티 트래킹 등 다양한 분야에서 활용됩니다. Kafka는 프로듀서(데이터를 생성하고 전송하는 역할)와 컨슈머(데이터를 읽어오는 역할)를 사용하여 데이터를 주고받을 수 있습니다.
이러한 특징으로 Kafka는 현대적인 데이터 처리 환경에서 중요한 역할을 하는 도구 중 하나로 꼽히며, 대규모 데이터 스트림 처리와 관련된 많은 시나리오에서 사용되고 있습니다.
Kafka 내부 동작 방식
Apache Kafka의 내부 동작 방식 살펴보겠습니다.
- 토픽과 파티션
- Kafka에서 데이터는 토픽(topic)에 속합니다. 토픽은 데이터를 논리적으로 분류하는 단위입니다.
각 토픽은 여러 개의 파티션(partition)으로 나뉩니다. 파티션은 물리적으로 데이터를 저장하고 분산 처리하기 위한 단위입니다.
데이터는 토픽의 파티션에 순서대로 저장됩니다.
- Kafka에서 데이터는 토픽(topic)에 속합니다. 토픽은 데이터를 논리적으로 분류하는 단위입니다.
- 프로듀서(Producer)
- 프로듀서는 데이터를 생성하고 Kafka 토픽에 발행(publish)합니다.
프로듀서는 데이터를 보낼 때 파티션을 선택할 수 있습니다. 이때, 라운드 로빈 방식, 해시 등의 전략을 사용할 수 있습니다.
- 프로듀서는 데이터를 생성하고 Kafka 토픽에 발행(publish)합니다.
- 브로커(Broker)
- 브로커는 Kafka 클러스터 내에서 데이터를 저장하고 관리하는 서버입니다.
클러스터는 여러 개의 브로커로 구성됩니다. 각 브로커는 데이터를 저장하고 다른 브로커와 통신하여 데이터를 전송합니다.
- 브로커는 Kafka 클러스터 내에서 데이터를 저장하고 관리하는 서버입니다.
- 파티션 리더와 복제
- 각 파티션은 여러 개의 복제본(replica)을 가질 수 있습니다. 하나의 복제본이 파티션 리더(leader)가 되고, 나머지는 팔로워(follower)가 됩니다.
프로듀서가 데이터를 쓸 때는 파티션 리더에게 전송됩니다. 이후, 리더는 데이터를 다른 복제본에게 복제합니다.
복제는 데이터의 내구성을 보장하며, 리더가 다운되더라도 팔로워 중 하나가 새로운 리더로 승격될 수 있습니다.
- 각 파티션은 여러 개의 복제본(replica)을 가질 수 있습니다. 하나의 복제본이 파티션 리더(leader)가 되고, 나머지는 팔로워(follower)가 됩니다.
- 컨슈머(Consumer)
- 컨슈머는 Kafka 토픽에서 데이터를 읽어옵니다.
컨슈머 그룹을 형성하여 여러 컨슈머가 동시에 데이터를 소비할 수 있습니다.
각 컨슈머 그룹은 토픽의 파티션을 분배받아 처리하며, 각 파티션은 하나의 컨슈머만 소비합니다.
- 컨슈머는 Kafka 토픽에서 데이터를 읽어옵니다.
- 이벤트 스트림과 보관 기간
- Kafka는 데이터를 이벤트 스트림으로 처리합니다. 이벤트는 시간에 따라 순차적으로 저장됩니다.
데이터의 보관 기간은 설정에 따라 다르며, 기간이 지난 데이터는 삭제될 수 있습니다.
- Kafka는 데이터를 이벤트 스트림으로 처리합니다. 이벤트는 시간에 따라 순차적으로 저장됩니다.
- 주키퍼(ZooKeeper)
- 주키퍼는 Kafka 클러스터의 메타데이터 관리와 리더 선출 등을 담당합니다.
브로커의 상태, 파티션 할당, 컨슈머 그룹 정보 등을 주키퍼를 통해 관리합니다.
- 주키퍼는 Kafka 클러스터의 메타데이터 관리와 리더 선출 등을 담당합니다.
Event Driven Architecture 와 kafka의 연관관계
이벤트 주도 아키텍처(Event Driven Architecture, EDA)와 Apache Kafka는 매우 관련된 개념입니다. EDA는 시스템의 컴포넌트들이 이벤트를 주고받는 구조를 설계하는 아키텍처 스타일이며, Kafka는 이러한 이벤트 주도 아키텍처를 구현하고 지원하는 분산 스트리밍 플랫폼입니다.
Kafka는 다음과 같은 측면에서 EDA와 관련이 있습니다.
- 이벤트 스트리밍: Kafka는 대용량의 이벤트 스트림을 처리하고 저장하는 데 사용됩니다. 시스템 내에서 발생하는 다양한 이벤트를 Kafka 토픽에 저장하고, 이를 구독하는 컴포넌트들이 이벤트를 읽어와 처리할 수 있습니다.
- 비동기 통신: Kafka는 비동기적인 통신을 제공하므로, 이벤트가 발생한 즉시 처리하지 않고 나중에 처리할 수 있습니다. 이는 EDA의 핵심 원칙 중 하나인 비동기성과 부합합니다.
- 포화도 처리: Kafka는 높은 처리량과 확장성을 제공하여 대용량의 이벤트 스트림을 처리할 수 있습니다. 이는 이벤트 주도 아키텍처에서 발생하는 다양한 이벤트들을 효과적으로 처리하기 위한 중요한 요소입니다.
- 이벤트 버스: Kafka는 이벤트를 중앙 집중적으로 관리하고 분배할 수 있는 이벤트 버스로 사용될 수 있습니다. 이벤트를 토픽으로 분류하고, 여러 컴포넌트가 해당 토픽을 구독하여 이벤트를 처리할 수 있습니다.
- 데이터 유지 관리: Kafka는 일정 기간 동안 데이터를 보관하므로, 이벤트 주도 아키텍처에서 중요한 역할을 하는 이벤트들을 오랫동안 저장하고 추적할 수 있습니다.
EDA와 Kafka는 현대적인 분산 시스템에서 실시간 이벤트 처리 및 데이터 스트리밍을 구현하는 데 많이 활용됩니다. 이 두 개념을 조합하면 실시간 데이터 흐름을 처리하고 분석하며, 시스템 내의 컴포넌트들 간에 느슨한 결합을 유지하는 효과적인 아키텍처를 구축할 수 있습니다.
