1. Kafka Producer — 실시간 데이터 수집
KIS API와 yfinance로부터 주식 시세 데이터를 실시간 수집합니다. 각 API의 특성과 장애 가능성을 고려하여 두 개의 Kafka 토픽으로 분리했습니다.
Kafka 토픽 구조
| 토픽 이름 | 목적 | 수집 소스 |
|---|---|---|
stock.kis | 1차 데이터 소스 | KIS API (한국투자증권) |
stock.yfinance | 장애 대비 백업 | yfinance |
토픽을 분리한 이유 — 데이터 출처별 신뢰도, latency, 응답 포맷 차이를 명확히 구분하여 downstream consumer에서 분기 처리와 fallback 전환을 용이하게 하기 위함입니다.
다중 소스 Fallback 전략
- Producer는 먼저 KIS API를 호출하고, 일정 시간 내 실패 시 yfinance로 전환합니다.
- API 호출 실패가 감지되면 해당 종목은
stock.yfinance토픽으로 발행됩니다.
KIS API 호출 시도
→ 성공: stock.kis 토픽으로 발행
→ 실패: yfinance 호출 후 stock.yfinance 토픽으로 발행
파티션 전략
토픽 내부 파티션은 종목 코드(symbol) 기준으로 분산됩니다.
partition_key = hash(symbol) % partition_count- 동일 종목은 항상 같은 파티션에 저장 → 순서 보장 및 상태 일관성 유지
- Consumer 그룹 확장을 통해 병렬 처리량 확대 가능
- Redis 등 외부 상태 저장소와 연계하기 용이 (종목별 마지막 수신 시간, 지표 캐시 등)
멱등성 및 데이터 유실 방지
| 설정 | 값 | 목적 |
|---|---|---|
enable.idempotence | true | 중복 메시지 방지 |
acks | all | 모든 복제본 확인 후 커밋 |
enable.auto.commit | false (Consumer) | 수동 커밋으로 처리 보장 |
- Deduplication:
(symbol, event_time)기준 upsert 적용, KIS 데이터 우선 반영 - Dead-letter Queue (
stock.dlq) — 파싱/재시도 실패 데이터는 DLQ에 저장 후 재처리
운영 모니터링
| 지표 | 설명 |
|---|---|
| Consumer lag | 미처리 메시지 수 |
| End-to-end latency | 수집 → 처리 지연 시간 |
| DLQ 발생률 | 실패 메시지 비율 |
| 에러율 | API 호출 실패율 |
SLA: 지연 > 1s 또는 DLQ 비율 > 0.1% 발생 시 알림 트리거