Kafka 사용 사례

Kafka는 다양한 산업과 시나리오에서 활용됩니다. 실제 기업들이 어떻게 Kafka를 사용하는지 살펴보겠습니다.

1. 메시징 시스템 (Messaging)

개요

전통적인 메시지 브로커를 대체하여 시스템 간 비동기 통신을 처리합니다.

아키텍처

주문 서비스 → Kafka (orders topic) → [결제 서비스, 재고 서비스, 배송 서비스, 알림 서비스]

실제 예시: 이커머스 주문 처리

1. 사용자가 주문
   ↓
2. 주문 서비스 → Kafka
   {
     "orderId": "12345",
     "userId": "user-001",
     "items": [...],
     "total": 50000
   }
   ↓
3. 여러 서비스가 병렬로 처리:
   ├── 결제 서비스: 결제 처리
   ├── 재고 서비스: 재고 차감
   ├── 배송 서비스: 배송 준비
   └── 알림 서비스: 주문 확인 이메일 발송

장점

  • 서비스 간 느슨한 결합 (Loose Coupling)
  • 비동기 처리로 응답 속도 향상
  • 특정 서비스 장애가 전체 시스템에 영향 없음
  • 새로운 서비스 추가가 용이

2. 로그 수집 및 집계 (Log Aggregation)

개요

분산된 여러 서버와 애플리케이션의 로그를 중앙 집중식으로 수집합니다.

아키텍처

[Web Server 1] ──┐
[Web Server 2] ──┤
[API Server 1] ──┼──→ Kafka (logs topic) ──→ [Elasticsearch, S3, Splunk]
[API Server 2] ──┤
[DB Server]    ──┘

실제 구현: Netflix

수천 대의 서버 로그
   ↓
Kafka (중앙 로그 허브)
   ↓
├── Elasticsearch: 실시간 검색 및 분석
├── S3: 장기 보관
└── Alerting System: 에러 모니터링

처리 규모:

  • 초당 수백만 개의 로그 이벤트
  • 일 8조 개의 이벤트

장점

  • 중앙 집중식 로그 관리
  • 실시간 로그 분석
  • 장기 보관 및 감사 추적

3. 이벤트 소싱 (Event Sourcing)

개요

애플리케이션의 모든 상태 변경을 이벤트로 저장합니다.

아키텍처

현재 상태를 저장하는 대신 → 모든 변경 이벤트를 저장

전통적 방식:
계좌 잔액: 100,000원

이벤트 소싱:
├── 입금: +150,000원
├── 출금: -30,000원
├── 출금: -20,000원
└── 현재 잔액: 100,000원 (재계산 가능)

실제 예시: 은행 계좌 시스템

// 이벤트 발행
public void deposit(String accountId, BigDecimal amount) {
    DepositEvent event = new DepositEvent(accountId, amount, LocalDateTime.now());
    producer.send("account-events", accountId, event);
}
 
// 이벤트 저장
Topic: account-events
├── [계좌개설]
├── [입금 10만원]
├── [출금 2만원]
├── [입금 5만원]
└── [출금 3만원]
 
// 언제든 과거 상태로 재구성 가능

장점

  • 완벽한 감사 추적 (Audit Trail)
  • 과거 임의 시점의 상태 재구성 가능
  • 데이터 손실 없이 버그 수정 후 재처리
  • 시간 여행 디버깅

4. 스트림 처리 (Stream Processing)

개요

실시간으로 데이터를 변환, 필터링, 집계합니다.

실제 예시 1: Uber의 실시간 가격 책정

운전자/승객 이벤트 → Kafka → Kafka Streams
   ↓
[실시간 집계]
├── 지역별 수요/공급 계산
├── 교통 상황 분석
└── 동적 가격 산출
   ↓
가격 조정 (Surge Pricing)
// Kafka Streams로 실시간 집계
KStream<String, RideRequest> requests = builder.stream("ride-requests");
 
KTable<String, Long> demandByRegion = requests
    .groupBy((key, request) -> request.getRegion())
    .windowedBy(TimeWindows.of(Duration.ofMinutes(5)))
    .count();
 
// 수요가 공급보다 많으면 가격 인상

실제 예시 2: 실시간 이상 거래 탐지

신용카드 거래 → Kafka → Kafka Streams
   ↓
[실시간 분석]
├── 짧은 시간 내 여러 거래
├── 평소와 다른 지역
├── 금액 패턴 이상
└── 이상 점수 계산
   ↓
이상 거래 알림 → 고객 SMS/앱 푸시

장점

  • 실시간 의사결정
  • 복잡한 이벤트 처리 (CEP)
  • Stateful 처리 (집계, 조인 등)

5. 메트릭 및 모니터링 (Metrics & Monitoring)

개요

시스템의 성능 메트릭을 실시간으로 수집하고 모니터링합니다.

아키텍처

[애플리케이션 서버들] → Kafka (metrics topic) → [Prometheus, Grafana, Alerting]

실제 예시: LinkedIn

메트릭 수집:
├── API 응답 시간
├── 에러율
├── CPU/메모리 사용률
├── 사용자 활동
   ↓
Kafka (실시간 전송)
   ↓
처리:
├── 실시간 대시보드 (Grafana)
├── 임계값 초과 시 알림
└── 장기 저장 (InfluxDB)

장점

  • 실시간 모니터링
  • 대규모 메트릭 처리
  • 중앙 집중식 관찰 가능성

6. CDC (Change Data Capture)

개요

데이터베이스의 변경사항을 실시간으로 캡처하여 다른 시스템에 전파합니다.

아키텍처

MySQL (변경사항) → Debezium (CDC Connector) → Kafka → [캐시, 검색엔진, 분석 DB]

실제 예시: 사용자 프로필 동기화

주 데이터베이스 (MySQL)
   ↓
사용자 정보 변경 감지 (Debezium)
   ↓
Kafka
   ↓
├── Redis: 캐시 업데이트
├── Elasticsearch: 검색 인덱스 업데이트
└── Data Warehouse: 분석용 동기화
-- MySQL에서 변경
UPDATE users SET email = 'new@example.com' WHERE id = 123;
 
-- Kafka로 전송되는 이벤트
{
  "op": "u",  // update
  "before": {"id": 123, "email": "old@example.com"},
  "after": {"id": 123, "email": "new@example.com"},
  "ts_ms": 1705123456789
}

장점

  • 실시간 데이터 동기화
  • 마이크로서비스 간 데이터 일관성
  • 읽기 전용 복제본 생성

7. 실시간 분석 (Real-time Analytics)

개요

대용량 데이터를 실시간으로 분석하여 즉각적인 인사이트를 제공합니다.

실제 예시: LinkedIn의 뉴스피드

사용자 활동 (좋아요, 댓글, 공유)
   ↓
Kafka
   ↓
실시간 분석:
├── 인기 게시물 계산
├── 트렌딩 토픽 추출
├── 개인화 추천
└── 실시간 통계
   ↓
뉴스피드 업데이트

실제 예시: 광고 플랫폼

광고 노출/클릭 이벤트 → Kafka → 실시간 집계
   ↓
분석:
├── CTR (클릭률) 계산
├── 광고 예산 소진율
├── 캠페인 성과
└── 이상 패턴 감지
   ↓
실시간 대시보드 제공

장점

  • 즉각적인 인사이트
  • 대규모 이벤트 처리
  • 실시간 의사결정 지원

8. IoT 데이터 수집

개요

수많은 IoT 디바이스에서 생성되는 센서 데이터를 수집합니다.

아키텍처

[센서 1] ──┐
[센서 2] ──┤
[센서 3] ──┼──→ Kafka ──→ [실시간 처리, 저장, 알림]
[센서 4] ──┤
[센서 N] ──┘

실제 예시: 스마트 팩토리

수천 개의 센서 (온도, 압력, 진동)
   ↓
초당 수백만 개의 데이터 포인트 → Kafka
   ↓
처리:
├── 이상 감지: 기계 고장 예측
├── 실시간 모니터링: 대시보드
└── 데이터 레이크: 장기 분석

장점

  • 대규모 디바이스 지원
  • 실시간 데이터 수집
  • 안정적인 버퍼링

9. 마이크로서비스 통신

개요

마이크로서비스 아키텍처에서 서비스 간 통신을 처리합니다.

아키텍처: 사가 패턴 (Saga Pattern)

주문 생성 성공 → Kafka
   ↓
├── 결제 서비스 → 성공 → Kafka
│   ↓
├── 재고 서비스 → 성공 → Kafka
│   ↓
└── 배송 서비스 → 실패 → Kafka
    ↓
    보상 트랜잭션:
    ├── 재고 복구
    ├── 결제 취소
    └── 주문 취소

장점

  • 서비스 독립성 유지
  • 탄력적인 시스템 (Resilient)
  • 분산 트랜잭션 처리

10. 실시간 추천 시스템

실제 예시: Netflix 추천

사용자 행동 (시청, 검색, 평가)
   ↓
Kafka → Kafka Streams
   ↓
실시간 분석:
├── 사용자 선호도 업데이트
├── 유사 사용자 그룹 계산
└── 개인화 추천 생성
   ↓
추천 API → 사용자 화면

장점

  • 실시간 개인화
  • 사용자 경험 향상
  • A/B 테스트 용이

주요 기업 사용 사례 요약

LinkedIn (개발사)

  • 용도: 활동 스트림, 메시징, 운영 메트릭
  • 규모: 7조+ 메시지/일, 1400+ 클러스터

Netflix

  • 용도: 로그 수집, 이벤트 처리, 추천 시스템
  • 규모: 8조+ 이벤트/일, 수 PB

Uber

  • 용도: 실시간 가격 책정, 위치 추적, 이벤트 소싱
  • 규모: 1조+ 메시지/일

Airbnb

  • 용도: 검색 인덱싱, 데이터 동기화, 실시간 분석
  • 규모: 수십억 메시지/일

Spotify

  • 용도: 로그 수집, 이벤트 전달, 추천 시스템
  • 규모: 수백억 메시지/일

Twitter

  • 용도: 실시간 타임라인, 알림, 분석
  • 규모: 수조 이벤트/일

사용 사례별 Topic 설계 예시

1. 주문 처리

topics:
├── orders: 주문 생성 이벤트
├── payments: 결제 이벤트
├── shipments: 배송 이벤트
└── order-status: 주문 상태 업데이트

2. 사용자 활동 추적

topics:
├── user-clicks: 클릭 이벤트
├── user-views: 페이지 뷰
├── user-purchases: 구매 이벤트
└── user-searches: 검색 쿼리

3. IoT 데이터

topics:
├── sensor-temperature: 온도 센서
├── sensor-pressure: 압력 센서
├── sensor-vibration: 진동 센서
└── sensor-alerts: 이상 알림

선택 가이드

요구사항Kafka 적합도
대용량 데이터 처리⭐⭐⭐⭐⭐
실시간 처리⭐⭐⭐⭐⭐
데이터 재처리 필요⭐⭐⭐⭐⭐
여러 소비자⭐⭐⭐⭐⭐
이벤트 소싱⭐⭐⭐⭐⭐
낮은 지연시간 (< 1ms)⭐⭐⭐
복잡한 라우팅⭐⭐⭐
트랜잭션 메시징⭐⭐⭐⭐

다음 단계

기초 개념을 이해했다면 아키텍처를 학습하세요:

참고 자료