피드로 돌아가기
비동기 요청-응답 패턴으로 풀어낸 발주 서비스 개발기
올리브영 테크블로그올리브영 테크블로그
Backend

비동기 요청-응답 패턴으로 풀어낸 발주 서비스 개발기

올리브영이 동기식 발주 처리를 Kafka 기반 비동기 요청-응답 아키텍처로 전환해 응답 속도 98.7% 단축 (218초 → 2.8초, 5,000건 기준)

2025년 6월 30일12intermediate

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으로 발행하면 클라이언트가 단일 응답 채널만으로 성공/실패를 모두 처리할 수 있다.

원문 읽기