[ 배민 선물하기에서 상품 재고관리 시스템은 어떻게 구성되어 있을까?]
많은 앱 및 웹에서 구매 기능을 제공하고 있습니다. 구매 기능은 돈을 다루기 때문에 다른 기능들 보다 특히 동시성과 데이터가 유실되지 않도록 각별히 주의를 기울여야 합니다
이 글은 상품재고 관리 부분에 초점이 있지만 선물하기에 대한 전반적인 서비스 설명이 잘 나타나있고 특히 트랜잭션의 범위와 in-memory, RDB 구성 및 동기/비동기의 이유 등이 논리적으로 잘 나타나있습니다.
글의 구성이 굉장히 깔끔하기 때문에 쓰윽 읽히지만 그 안에 많은 고민이 있었다는 것을 느낄수 있습니다.
개인적으로 이 글과 같이 “맥락 -> 요구사항 -> 설계 -> 구현” 형식으로 프로젝트를 회고하면 명백하겠다 라는 생각이 들었습니다
[요약]
재고관리 요구사항🎯
1. 상품위 분류별로 전체 재고수량과 인당 재고수량이 관리되어야 한다.
2. 상품은 전체 제고량을 초과하여 판매하면 안된다.
3. 판매가 시작되면 상품의 전체 재고수량은 감소시킬 수 없다.
재고관리 설계🔗
1. 전체 재고량 관리와 트랜잭션이 일어나는 재고 사용량은 분리하여 저장한다.
2. 재고 사용량의 증가와 감소시 동시성 이슈는 없어야 한다.
3. 재고 사용량 데이터는 유실되어서는 안된다.
4. 재고 사용량 관리는 Redis Set 자료구조를 이용하여 상품에 대한 구매번호의 중복을 허용하지 않음을 보장한다.
구현🧑🏻💻
- 상세하고 간결합니다!!
- 단일 스레드에서 처리하기 위해 트랜잭션 안에 레디스 단에서 사용하는 오퍼레이션들에도 트렌젝션 처리합니다.
- 구매 취소에 따른 재고 사용 감소는 비동기로 처리하였는데 그 이유는 글에서 확인!