주문서비스 → Kafka에 "주문됨" 메시지 저장 → 유저에게 즉시 응답 ✅
재고서비스 → 나중에 살아나면 Kafka에서 읽어서 처리
핵심 이점
서비스 간 의존성 제거 (재고서비스 죽어도 주문 가능)
비동기 처리 (유저는 기다리지 않음)
메시지가 보존됨 (재고서비스가 살아나면 밀린 것 처리)
2. 핵심 용어 3개
토픽(Topic) = 우체통 분류함
order-events, payment-events, stock-events...
프로듀서(Producer) = 편지 쓰는 사람
메시지를 Kafka에 넣는 서비스
컨슈머(Consumer) = 편지 받는 사람
Kafka에서 메시지를 읽어서 처리하는 서비스
Bitnami 이미지는 2025년 8월부터 유료화됨.
apache/kafka:3.9.0 공식 이미지 사용 권장.
6. 이커머스에서 Kafka의 함정
핵심 착각
“Kafka 있으면 재고서비스 죽어도 주문 가능” → 이커머스에서 이게 독이다.
왜 함정인가
Kafka 문서가 보여주는 장점
재고서비스 죽어도 주문 접수 ✅
나중에 살아나면 밀린 것 처리 ✅
이커머스에서 실제로 일어나는 일
주문 접수됨 → 유저한테 응답
↓
재고서비스 죽음
↓
나중에 살아나서 처리
↓
근데 그 사이에 재고가 0 됨
↓
재고 없는데 주문 완료 💥
Kafka 써도 되는 곳 vs 안 되는 곳
구간
Kafka
이유
주문 생성
❌
실패하면 안 됨
재고 차감
❌
즉시 일관성 필요
결제 처리
❌
돈 관련
환불
❌
돈 관련
배송 알림
✅
늦어도 됨
이메일/푸시
✅
실패해도 재시도 가능
통계 집계
✅
Eventually OK
정산 배치
✅
배치로 처리
타임딜 프로젝트에서 실제로 발생한 허점
타임딜 구현 (Go + Kafka + Saga)
ORDER_CREATED → Kafka 발행
STOCK_RESERVED → Kafka 발행 ← 재고 차감을 비동기로 처리
PAYMENT_COMPLETED → Kafka 발행
문제
Outbox 없음 → Kafka produce 실패 시 이벤트 유실
Saga 상태 인메모리 → 서버 재시작 시 어디까지 했는지 모름
보상 트랜잭션 실패 → 재고 롤백도 실패 가능, 아무도 모름
부하테스트로는 안 잡힌다
k6로 1만 TPS 밀어도 정상.
장애는 타이밍에서 난다.
네트워크 순단, 서버 재시작, 결제 버튼 두 번 클릭…
이건 부하테스트가 아닌 실제 운영에서만 터진다.