Skip to main content
이 문서는 선행 지식 섹션의 일부입니다.

왜 실시간 처리가 필요한가요?

비즈니스 환경이 점점 빨라지면서, “어제의 데이터”가 아닌 “지금의 데이터”로 의사결정해야 하는 상황이 많아졌습니다.

실시간 처리의 핵심 구성 요소

실시간 데이터 처리 시스템은 일반적으로 세 가지 구성 요소로 이루어집니다.

Apache Kafka

개념

💡 Apache Kafka 는 LinkedIn에서 개발한 분산 이벤트 스트리밍 플랫폼 입니다. 초당 수백만 건의 이벤트를 안정적으로 수집하고, 여러 소비자에게 전달할 수 있습니다. 현재 전 세계 Fortune 500 기업의 80% 이상이 사용하고 있습니다.

핵심 개념

Apache Kafka 구조

Kafka의 특징

관련 솔루션


스트림 처리 엔진

메시지 큐에서 이벤트를 받아 실시간으로 처리하는 엔진들을 살펴보겠습니다.

Apache Spark Structured Streaming

💡 Spark Structured Streaming 은 Apache Spark의 스트리밍 모듈로, 마이크로 배치(Micro-Batch) 방식으로 스트리밍 데이터를 처리합니다. 배치 코드와 동일한 DataFrame API를 사용할 수 있어서, 배치→스트리밍 전환이 매우 쉽습니다.
💡 Apache Flink 는 진정한 이벤트 단위(Event-at-a-time) 스트리밍 처리 엔진입니다. 이벤트가 도착하는 즉시 하나씩 처리하므로, Spark의 마이크로 배치보다 더 낮은 지연 시간(밀리초 수준)을 달성할 수 있습니다.
💡 체크포인트(Checkpoint)란? 스트리밍 처리의 현재 진행 상태(어디까지 읽었고, 어떤 집계 값을 가지고 있는지)를 주기적으로 저장하는 것입니다. 장애가 발생하면 마지막 체크포인트부터 재시작하여 데이터 유실 없이 처리를 이어갈 수 있습니다.

이벤트 드리븐 아키텍처 (EDA)

개념

💡 이벤트 드리븐 아키텍처(Event-Driven Architecture, EDA) 란 시스템의 구성 요소들이 이벤트 를 중심으로 통신하는 아키텍처 패턴입니다. A 서비스에서 발생한 이벤트를 Kafka 같은 메시지 큐에 발행하면, 관심 있는 다른 서비스들이 이를 구독하여 처리합니다.
이벤트 드리븐 아키텍처 (마이크로서비스)

EDA의 장점


Databricks에서의 실시간 처리

Databricks는 Spark Structured Streaming 을 기반으로 실시간 처리를 지원하며, 이를 Medallion 아키텍처와 결합하여 사용합니다.

Kafka를 직접 운영해본 경험 — ZooKeeper의 고통

Kafka를 Confluent Cloud나 Amazon MSK 같은 관리형 서비스로 사용하면 편리하지만, 직접 운영한다면 이야기가 완전히 달라집니다.

ZooKeeper 관리의 고통

Kafka는 오랫동안 ZooKeeper 라는 분산 코디네이션 서비스에 의존해왔습니다. ZooKeeper가 죽으면 Kafka도 죽습니다.
🆕 KRaft 모드 (2024~): Kafka 3.3 이후부터 ZooKeeper 없이도 동작하는 KRaft(Kafka Raft) 모드가 도입되었습니다. Kafka 4.0부터는 ZooKeeper가 완전히 제거될 예정입니다. 새로 구축하는 경우 KRaft를 사용하시는 것을 권장합니다.

파티션 리밸런싱의 악몽

Kafka Broker를 추가하거나 제거할 때, 파티션을 재분배해야 합니다. 이 과정에서 대량의 데이터가 네트워크를 통해 복사되며, 클러스터 전체의 성능이 저하됩니다.
💡 현업에서는 이렇게 합니다: 파티션 수는 “현재 필요한 수의 23배”로 넉넉하게 설정합니다. 나중에 늘리는 것은 가능하지만, 줄이는 것은 토픽을 재생성해야 하므로 매우 번거롭습니다. 일반적으로 토픽당 파티션 612개로 시작하고, Consumer 수에 맞춰 조정합니다.

Kafka 비용의 현실

💡 이것을 안 하면…: Kafka 모니터링을 설정하지 않으면, Consumer Lag(소비 지연)이 쌓이고 있는지 알 수 없습니다. 어느 날 갑자기 “실시간 대시보드가 3시간 전 데이터를 보여주고 있다”는 보고를 받게 됩니다. 최소한 Consumer Lag, Broker Disk Usage, ISR Shrink 이 세 가지는 반드시 모니터링하세요.

”실시간이 필요하다고 생각했는데, 마이크로배치로 충분했던 경우”

현업에서 “실시간 처리가 필요합니다”라는 요구사항을 받으면, 먼저 정말 실시간이 필요한지 를 따져봐야 합니다.

진짜 실시간(밀리초) vs 니어 실시간(초분) vs 마이크로배치(분시간)

💡 현업에서는 이렇게 합니다: 고객이 “실시간”이라고 말할 때, 실제로 의미하는 것은 대부분 “1시간 전 데이터가 아니라 5분 전 데이터를 보고 싶다”입니다. 이 정도의 요구사항은 Spark Structured Streaming의 마이크로배치(수 초~수 분 간격)로 충분히 충족됩니다. 진짜 밀리초 수준의 실시간이 필요한 경우는 전체 워크로드의 5% 미만입니다.

Databricks Structured Streaming과의 연결

Databricks에서 실시간 처리를 구현하는 가장 일반적인 패턴은 다음과 같습니다.
SDP(Spark Declarative Pipelines)를 사용하면 더 간단해집니다:
💡 현업에서의 판단 기준: “마이크로배치로 충분한 워크로드에 Flink를 도입하면, 시스템 복잡성만 증가하고 ROI가 나오지 않습니다.” Databricks를 이미 사용 중이라면, Structured Streaming부터 시작하고, 정말 밀리초 수준의 지연이 필요한 워크로드만 Flink로 분리하는 것이 현실적입니다.

실시간 처리 아키텍처 패턴

Lambda 아키텍처

💡 Lambda 아키텍처배치 레이어스피드 레이어(실시간)를 분리하여, 각각의 장점을 활용하는 아키텍처입니다. 배치는 정확성을, 스피드는 속도를 담당합니다.
단점: 같은 로직을 배치용과 스트리밍용으로 두 번 구현해야 하는 유지보수 부담이 있습니다.

Kappa 아키텍처

💡 Kappa 아키텍처 는 모든 데이터를 스트리밍으로만 처리 하는 아키텍처입니다. 배치 처리가 필요하면, 과거 이벤트를 Kafka에서 다시 읽어서(재처리) 스트리밍 파이프라인으로 처리합니다.

Delta 아키텍처 (Databricks 권장)

Databricks는 Delta Lake의 배치/스트리밍 통합 능력 을 활용하여, 하나의 코드로 배치와 스트리밍을 모두 처리하는 방식을 권장합니다. Lambda나 Kappa의 장점을 모두 취하면서 복잡성을 줄입니다.

아키텍처 선택 가이드

💡 현업에서는 이렇게 합니다: “어떤 아키텍처를 선택할지” 고민하기보다, “Databricks + Delta Lake를 쓴다면 Delta 아키텍처가 자동으로 따라온다”고 생각하시면 됩니다. Structured Streaming으로 실시간 데이터를 Delta에 쓰고, 같은 테이블을 배치 잡으로도 읽고 쓸 수 있으므로, 별도의 아키텍처 설계가 크게 필요하지 않습니다.

실시간 처리 도입 시 체크리스트

실시간 처리를 도입하기 전에 아래 항목들을 점검하세요.
💡 현업에서는 이렇게 합니다: 실시간 처리를 처음 도입할 때는, 전체 파이프라인을 한 번에 실시간으로 전환하지 마세요. 가장 비즈니스 임팩트가 큰 하나의 파이프라인을 먼저 실시간으로 전환하고, 안정화된 후에 점진적으로 확대하는 것이 현실적입니다.

정리

이것으로 선행 지식 섹션을 마치겠습니다. 이제 01. 데이터 기초로 진행하시면, Databricks 중심의 본격적인 학습을 시작하실 수 있습니다.

참고 링크