피드로 돌아가기
재고의 변동을 시계열 데이터로?!
올리브영 테크블로그올리브영 테크블로그
Backend

재고의 변동을 시계열 데이터로?!

올리브영 인벤토리 스쿼드가 Redis Stream으로 1,000만 SKU의 재고 변동을 시계열 데이터로 기록해 대량 동기화 시 Redis CPU 및 API 레이턴시 급증 문제 해결

2024년 11월 15일10intermediate

Context

올리브영은 1,000만 개 이상의 SKU에 대해 일정 주기마다 모든 재고 정보를 대량으로 조회하는 외부 시스템들이 있었다. Hash 타입 Redis에 최신 재고만 저장하는 구조에서는 동기화 시마다 전체 데이터를 조회해야 해서 주기마다 Redis CPU 및 API Latency가 급격히 증가했다.

Technical Solution

  • Redis Hash에서 Redis Stream으로 변경: append-only 로그 방식으로 POS, 물류관리시스템, 백오피스 등에서 발생하는 판매, 입고, 반품, 폐기 등 모든 재고 변동 이벤트 기록
  • Entry ID 자동 생성으로 처리 순서 보장: millisecondTime-sequenceNumber 형식으로 동일 밀리초 내 64비트 범위의 sequenceNumber로 무제한 순서 보장
  • 날짜 기반 Stream Key 설계: "StreamKey-날짜" 형식으로 당일 변동 재고만 저장하고 TTL 설정으로 지난 데이터 자동 정리
  • XRANGE의 O(log(N)+M) 복잡도 문제 해결: 조회 범위를 시간 단위로 분할해 병렬 조회 및 RedissonReactiveClient로 리액티브 프로그래밍 적용
  • 시간대별 데이터 분포 분석: Entry의 시간대별 분포도를 파악해 각 시스템에 맞는 최적 조회 범위 결정

Impact

아티클에 정량적 수치가 명시되지 않음

Key Takeaway

Redis Stream은 append-only 시계열 데이터 처리 특성으로 대량의 변동 이벤트를 효율적으로 기록할 수 있으며, 적절한 범위 분할과 병렬 조회 패턴으로 싱글 스레드 Redis의 성능 한계를 극복할 수 있다.


대량의 변동 데이터를 다루는 백엔드 서비스에서 Redis Stream을 활용할 때, Entry ID 범위를 시간 단위로 분할해 병렬 조회하고 RedissonReactiveClient와 리액티브 프로그래밍을 조합하면 데이터 분포에 맞는 최적 조회 범위 설정으로 싱글 스레드 Redis의 블로킹 시간을 최소화할 수 있다.

원문 읽기