신규 재고 시스템 구축을 위한 개발 여정
올리브영이 Oracle DB 집중화로 인한 트래픽 부하를 Redisson 분산 락, Kafka MSK, Reactive Programming으로 분산 재고 시스템 구축
AI 요약
Context
올리브영의 Oracle DB에 전국 매장 POS, 물류 시스템, 관리자 등 다양한 클라이언트로부터 동시 호출이 집중되면서 DB 부하 증가 및 성능 저하 발생했다. 온라인몰에서 매장 재고를 실시간으로 조회하는 오늘드림 서비스 기반으로 POS 주문/취소 이벤트가 중계 서버를 거쳐 Transaction 데이터 형태로 Oracle DB에 등록되면서 불필요한 I/O 리소스 낭비가 발생했다.
Technical Solution
- 동시성 제어 구현: Redisson의 RLock 분산 락을 AOP로 적용하고 tryLock 메서드 활용으로 락 상태 즉시 파악 및 데이터 일관성 보장
- 메시지 기반 이벤트 연동: AWS MSK 기반 Kafka Message Streaming으로 POS 재고 이벤트를 Oracle DB 거치지 않고 신규 재고 시스템으로 직접 적재
- 비동기 Batch 전송 방식: 중계 서버 리소스 최소화를 위해 batch.size, linger.ms 옵션으로 재고 이벤트를 배치 처리하여 네트워크 I/O 최적화
- 반응형 프로그래밍 도입: RedissonReactiveClient를 활용해 매장의 다수 상품 재고를 비동기 데이터 스트림으로 처리하여 API 응답성능 향상
- 장애 자동 복구 메커니즘: Amazon MemoryDB 장애 시 Resilience4j CircuitBreaker로 기존 DB로 자동 전환하고 정상화 시 자동 복귀
Impact
아티클에는 정량적 성능 수치(응답 시간, 처리량 개선 %, 레이턴시 감소값)가 구체적으로 명시되지 않았다.
Key Takeaway
분산 환경에서의 동시성 제어는 Redisson의 Pub/Sub 기반 분산 락으로 단순히 구현하되, 기존 레거시 시스템의 리소스 제약을 고려하여 비동기 Batch 전송 방식으로 I/O 부하를 최소화해야 한다. 신규 인프라 안정화를 위해 CircuitBreaker로 롤백 경로를 미리 확보하는 것이 대규모 전환 프로젝트의 필수 요소다.
실천 포인트
다중 클라이언트로부터 동시 접근이 발생하는 재고/주문 시스템을 개발할 때, Redisson RLock의 tryLock 메서드와 leaseTime, waitTime 옵션을 조정하여 lock contention을 줄이고, Kafka를 메시지 브로커로 도입해 DB 트래픽을 분산하며, 비동기 배치 전송으로 레거시 시스템의 리소스 부담을 최소화할 수 있다.