본문 바로가기

Event-Driven Development

Apache Kafka 2.8 - Introduction

원문: https://kafka.apache.org/documentation/#introduction

 

Apache Kafka

Apache Kafka: A Distributed Streaming Platform.

kafka.apache.org

 

Event streaming이란 무엇인가?

Event streaming(이하 이벤트 흐름)은 인간의 몸에 있는 중추 신경계에 대응되는 디지털 세계에서의 개념이다. 이 개념은 'always-on' 세계의 기술적 기초가 된다. always-on 세계의 비즈니스는 점점 더 소프트웨어에 의해 정의되고 자동화된다. 또한 그런 비즈니스에서의 소프트웨어 사용자들은 더 소프트웨어화된다.

 

 기술적으로 말하자면, 이벤트 흐름은 다음과 같은 일을 해낸다.

  • 이벤트가 흐르는 형태를 가진 DB, 센서, 휴대폰, 클라우드, 소프트웨어 앱 등으로부터 실시간 데이터를 확보
  • 추후 검색을 위해 이 이벤트 흐름들을 저장
  • 과거 뿐 아니라 실시간의 이벤트 흐름들에 대하여 처리 및 대응
  • 이벤트 흐름이 필요로하는 다른 기술들에 라우팅

따라서 이벤트 흐름은 데이터의 연속적인 흐름과 해석을 보장한다. 이를 통해 알맞은 정보가 알맞은 때와 장소에 있도록 해준다.

 

Event streaming을 어디에 쓰는가?

이벤트 흐름은 광범위한 산업과 조직들에 있어서 아주 다양한 상황에 적용된다.

그 용례들은 다음 항목들을 포함하고 있다.

  • 실시간 결제 및 금융 트랜잭션 처리하기. 증권 거래, 은행, 보험 등
  • 자동차, 트럭, 선박, 수송 등의 실시간 추적 및 모니터링. 운송업과 자동차 산업
  • IoT 장치 또는 다른 장비들로부터 지속적인 센서 데이터 확보 및 분석. 공장과 풍력 단지
  • 고객 상호작용과 주문에 대한 수집 및 즉각적인 대응. 소매점, 호텔, 여행업, 모바일 애플리케이션
  • 병원 환자의 모니터링과 응급 상황에서의 적절한 치료를 보장하기 위한 건강상태 변화 예측
  • 회사 내의 다양한 부서들이 생산하는 데이터를 연결하고 저장하며 사용가능하도록 만들기
  • 데이터 플랫폼, 이벤트 주도 아키텍처, 마이크로서비스를 제공하는 기반

 

Apache Kafka®는 event streaming 플랫폼이다. 이것은 무엇을 의미하는가?

Kafka는 세 가지 주요 기능을 조합하여, 여러분이 사용하고자 하는 곳에 단일하고 효과적인 솔루션을 통해 종단(端) 간의 이벤트 흐름을 만들어낼 수 있도록 한다.

  1. 다른 시스템들로부터의 데이터를 지속적으로 import하고 export함으로써, 이벤트들의 흐름을 발행(작성)하고 구독(읽기)하기.
  2. 여러분이 원하는만큼 이벤트의 흐름을 저장하기.
  3. 이벤트가 발생할 때 또는 이미 발생한 것들에 대한 흐름 처리하기.

이 모든 기능들은 분산되어있고, 매우 확장성 있으며, 유연하고, 고장에 강하며, 안전한 방법으로 제공된다.

Kafka는 베어메탈 하드웨어, 가상머신, 컨테이너, 클라우드, 온프레미스 상에 배포될 수 있다.

여러분은 Kafka 환경을 스스로 관리하는 것과 여러 제공사들을 통해 관리받는 것 중에서 선택할 수 있다.

 

요약하자면 Kafka는 어떻게 작동하는가?

Kafka는 TCP 네트워크 프로토콜을 통해 통신하는 서버클라이언트로 구성된 분산 시스템이다.

Kafka는 베어메탈 하드웨어, 가상머신, 온프레미스의 컨테이너, 클라우드 환경에 배포할 수 있다.

 

[서버]

Kafka는 여러 데이터 센터나 클라우드 지역으로 확장 가능한 복수 서버들의 클러스터로써 구동된다. 

이 중 몇몇 서버는 'brokers(브로커)'라 불리는 스토리지 계층을 형성한다.

다른 서버들은 여러분의 시스템(다른 Kafka 클러스터나 관계형 데이터베이스)을 Kafka와 통합시키기 위해 데이터를 지속적으로 import하고 export하는 이벤트 흐름을 만드는  Kafka Connect를 실행한다.

여러분이 필수적인 임무를 수행해낼 수 있도록, Kafka 클러스터는 매우 확장성 있고, 고장에 강하다.

만약 서버 중 일부에 문제가 생기면, 다른 서버들이 해당 서버의 작업을 가져가 데이터 소실없이 지속적인 작동이 가능하도록 보장한다.

 

[클라이언트]

여러분이 만든 분산 애플리케이션이나 마이크로서비스로 하여금 병렬로, 확장성 있게, 심지어 네트워크나 기계 고장의 경우에도 버틸 수 있는 방법으로 이벤트의 흐름을 읽고, 쓰고, 처리하도록 할 수 있다. 

Kafka는 Kafka 커뮤티니를 통해 제공되는 수십 종류의 클라이언트들을 포함한다.

높은 수준의 Kafka Streams 라이브러리를 포함한 클라이언트는 Java, Scala, Go, Python, C/C++와 다른 여러 프로그래밍 언어 및 REST API에 사용할 수 있다.

 

주요 개념들

이벤트(event)란 실세 세상이나 여러분의 비즈니스에서 '발생한 어떤 것'을 뜻한다.

이벤트는 레코드(record) 혹은 메시지(message)라고도 불린다.

여러분이 Kafka에 데이터를 읽고 쓸 때, 여러분은 이벤트로써 이 일을 하고 있는 것이다.

개념적으로 이벤트는 , , 발생시간, optional한 메타데이터 헤더를 가진다.

다음의 이벤트 예시를 보자.

  • 이벤트 키 : "Alice"
  • 이벤트 값 : "Bob에게 200달러를 지불하다"
  • 이벤트 발생시간 : "2020년 6월 25일 오후 2시 6분"

Producers는 Kafka에 이벤트들을 발행(작성)하는 클라이언트 애플리케이션들이다.

Consumers는 이런 이벤트들을 구독(읽고 처리)한다.

Kafka에서 producers와 consumers는 완전히 디커플링되어 있으며 서로의 존재에 대해 알지 못한다.

이것이 익히 알려진대로 높은 수준의 확장성을 가질 수 있는 Kafka의 주요 설계 요소이다.

예를 들어, producers는 consumers를 기다려 줄 필요가 없다.

Kafka는 이벤트를 정확히 한 번만 처리하도록 하는 등의 다양한 기능들을 보장한다.

 

이벤트들은 topics에 조직화되어 저장된다.

아주 간단히 말하자면, topic은 파일 시스템의 폴더와 비슷하고 이벤트는 그 폴더 안의 파일과 비슷하다.

예컨대, topic의 이름은 "payments"가 되는 것이다.

Kafka의 topic들은 항상 multi-producer이며 multi-subscriber이다.

하나의 topic에는 이벤트를 작성하는 producer가 없거나 하나 있거나 여럿이 있을 수 있으며 마찬가지로 그 이벤트들을 구독하는 consumer 역시 없거나 하나 있거나 여럿이 있을 수 있다.

이벤트들은 전통적인 메시지 시스템처럼 소비 후에 지워지는 것이 아니라 원하는 때마다 읽어볼 수 있다.

대신 여러분은 오래된 이벤트들이 지워지도록, topic마다 설정을 통해 Kafka가 얼마나 오랫동안 이벤트들을 저장하고 있어야 하는지 정의해야한다.

Kafka의 수행능력은 데이터의 크기에 관계없이 효율적이기 때문에 데이터를 오래 보관하는 것은 상관이 없다.

 

Topic들은 서로 다른 Kafka broker들에 위치한 수많은 "bucket"에 분할되어 있다.

이렇게 여러분의 데이터가 분할되어 위치해있는 것은 확장성을 위해 매우 중요한데 왜냐하면 클라이언트 애플리케이션들이 동시에 많은 broker들을 통해 데이터를 읽고 쓰게 해주기 때문이다.

새로운 이벤트가 topic에 발행되면, 그것은 실제로 topic의 한 부분에 추가된다.

같은 키(e.g. 고객 이름이나 자동차ID 등)를 가진 이벤트들은 같은 부분에 쓰여진다.

그리고 Kafka는 해당 topic 부분을 전달받은 그 어떤 consumer라도 정확히 쓰여진 순서대로 읽도록 보장한다.

이 예시 topic은 P1부터 P4까지 네 개의 부분을 가지고 있다. 다른 두 producer 클라이언트들이 서로에 대해 독립적으로 발행하고 있으며, 새로운 이벤트들은 네트워크를 통해 topic의 특정 부분에 쓰여진다. 같은 키(그림에 같은 색으로 표시된)를 가진 이벤트들은 같은 부분에 쓰여진다. 두 producer 모두 적절하기만 하다면 같은 부분에 작성할 수 있다는 점을 주목하자.

 

 여러분의 데이터가 고장에 강하고 높은 가용성을 가지려면 모든 topic은 복사되어야 한다. 심지어 다른 물리적인 지역이나 데이터센터에 복사되어야 한다. 그곳에는 문제의 발생에 대비하여 데이터의 복사본을 가진 여러 broker들이 있으므로 여러분은 그들에 대한 유지관리를 원할 것이다.

일반적으로는 3개 정도의 복사본으로 운영 환경을 세팅한다. 이렇게 하면 항상 여러분의 데이터는 3벌씩 존재하게 된다.

이 복사본들은 topic의 부분으로서의 역할을 하게 된다.

 

 앞선 글이 소개로서는 충분할 것이다.

디자인 섹션에서 Kafka의 다양한 개념들에 대한 상세한 설명을 찾아볼 수 있다.

 

Kafka APIs

 작업 관리를 위한 커맨드 라인 도구에 더불어, Kafka는 Java와 Scala를 위한 핵심 API 5가지를 제공한다.

  • Admin API : topics, brokers, Kafka의 객체들을 관리하고 검사하기 위한 API.
  • Producer API : 하나 이상의 Kafka topic들에 이벤트의 흐름을 발행(작성)하기 위한 API.
  • Consumer API : 하나 이상의 topic들을 구독(읽기)하며 이벤트의 흐름을 처리하기 위해 API.
  • Kafka Streams API : 애플리케이션과 마이크로서비스의 흐름 처리를 수행하기 위한 API. 이벤트 흐름을 처리하기 위한 높은 수준의 함수들이 제공된다. aggregation, join, windowing, 이벤트 시간 기반 처리 등과 같은 stateful한 처리들과 transformation을 포함한다. 하나 이상의 topic을 읽은 입력을, 하나 이상의 topic에 대한 출력으로 만들어냄으로써, 효과적으로 input 흐름을 output 흐름으로 변환할 수 있다.
  • Kafka Connect API : 재사용 가능한 데이터를 구축하고 구동하기 위한 API. 이벤트의 흐름을 소비(읽기)하거나 생산(쓰기)하는 연결자들을, import하거나 외부 시스템과 애플리케이션으로 export함으로써 연결자들이 Kafka와 통합될 수 있게 해준다. 예를 들어, PostgreSQL과 같은 관계형 DB에 대한 연결자는 테이블의 모든 변경 사항을 인지하고 있을 것이다. 하지만 실제로 여러분은 여러분의 연결자들을 실행할 필요가 없다. 왜냐하면 Kafka의 커뮤니티에서 이미 가져다 쓰기만하면 되는 연결자들을 제공하고 있기 때문이다.