피드로 돌아가기
올리브영 테크블로그Backend
원문 읽기
비동기 요청-응답 패턴으로 풀어낸 발주 서비스 개발기
올리브영이 동기식 발주 처리를 Kafka 기반 비동기 요청-응답 아키텍처로 전환해 응답 속도 98.7% 단축 (218초 → 2.8초, 5,000건 기준)
AI 요약
Context
올리브영의 기존 발주 시스템은 5,000개 상품 발주 시 수 분의 응답 지연이 발생했으며, 유효성 검증 단계에서 병목이 집중되었다. 동기식 처리로 인해 서버 메모리가 장시간 점유되면서 간헐적 장애가 발생하고, 신규 백오피스(브랜드원) 도입에 따라 공통 발주 서비스의 구축이 필요했다.
Technical Solution
- 요청 DTO 구조 개선: 단일 레코드 기반 구조에서 그룹 기반 구조로 변경하여 물류센터·발주일자 기준으로 그룹화하고, 헤더 레벨 유효성 검증의 중복을 제거
- Kafka 기반 비동기화 도입: 클라이언트 요청 시점에 메시지를 Kafka로 발행하고 즉시 응답 반환, 유효성 검증과 발주 처리를 별도 Consumer에서 비동기 처리
- API + Kafka 하이브리드 요청-응답 아키텍처 구현: 클라이언트가 발주 API 호출 → 요청 이력 생성 및 이력 ID 응답 → Consumer가 비동기 처리 → 결과 조회 API를 통해 처리 상태 확인
- Kafka at-least-once 특성의 중복 처리 방지: Consumer 재처리 시 멱등성 보장을 위해 처리 전 요청 이력 테이블에서 중복 여부 확인 후 조건부 처리
- Dead Letter Topic(DLT) 예외 처리: DLT Listener에서 실패 응답 메시지를 생성하여 Reply Topic으로 발행, 요청 메시지 헤더의 예외 정보를 활용한 Slack 알림으로 실시간 대응
Impact
- 평균 응답 속도: 0.1초 수준 달성
- 백오피스 요청 응답 속도: 218초에서 2.8초로 98.7% 향상 (5,000건 기준)
Key Takeaway
대규모 배치 처리가 필요한 백오피스 시스템에서 동기식 아키텍처의 병목을 해결할 때는 처리 프로세스의 병목 지점을 먼저 파악한 뒤(예: 유효성 검증), 데이터 구조 최적화와 비동기화를 단계적으로 적용하되, Kafka의 메시지 내구성과 중복 처리 전략을 함께 고려해야 한다.
실천 포인트
대량 데이터를 배치 처리하는 백오피스 또는 주문 시스템에서 Kafka를 이용한 비동기 요청-응답 패턴을 도입할 때, 요청 이력 테이블에서 중복 여부를 사전 확인하는 방식으로 at-least-once 전달 특성으로 인한 중복 처리를 방지하고, DLT Listener에서 실패 응답을 Reply Topic으로 발행하면 클라이언트가 단일 응답 채널만으로 성공/실패를 모두 처리할 수 있다.