재고 동시성 면접 질문: 동시 주문에 재고 차감이 사라지는 순간
시스템 디자인 Vol.1 · 08장 「초과 판매 없는 재고 차감」에서
이런 화면입니다
쇼핑몰 상품 페이지에 「품절 임박, 3개 남음」이 떠 있습니다. 마지막 재고를 두고 여러 명이 동시에 구매 버튼을 누릅니다.
남은 3개에 일곱 건의 주문이 동시에 닿습니다. 세 명까지만 성공해야 합니다.
면접관이 이렇게 묻습니다
재고가 3개 남은 상품에 주문이 동시에 들어옵니다. 재고보다 많이 팔리면 안 되고, 재고가 음수가 되어도 안 됩니다. 설계해 보세요.
범위부터 좁힙니다
한 줄로 좁힙니다. 주문이 들어오면 재고를 줄이고, 재고만큼만 팔고, 0 아래로는 절대 내려가지 않게. 결제와 배송은 접고 차감 그 순간에 집중합니다.
읽어 와서 계산해 덮어쓰는 코드가 동시에 여러 번 돌 때 어디서 값을 잃는지가 핵심 질문입니다.
가장 많이 나오는 답
재고를 읽어 와 애플리케이션에서 1을 빼고, 그 값을 도로 씁니다.
int stock = repo.findStock(itemId); // 3
if (stock > 0) {
repo.updateStock(itemId, stock - 1); // 2
}
주문이 하나씩 들어오면 3, 2, 1, 0으로 정확하게 줄어듭니다.
그런데 여기서 깨집니다
두 요청이 같은 3을 읽습니다. 둘 다 코드에서 1을 빼 2를 만듭니다. 둘 다 2를 씁니다. 주문은 두 건 나갔는데 재고는 한 개만 줄었습니다. 차감 하나가 증발합니다.
이 일이 마지막 재고 근처에서 벌어지면 남은 것보다 많이 팔립니다. 화면에서 음수를 숨기는 것으로는 이미 받은 주문이 사라지지 않습니다.
떨어지는 답은 이런 모양입니다
- 읽어 와서 코드에서 빼고 덮어씁니다.
- 두 요청이 같은 값을 읽는 경우를 생각하지 못합니다.
- 재고가 음수가 되면 화면에서 숨기면 된다고 답합니다.
면접관은 여기서 멈추지 않습니다
한 주문에 상품이 여러 개 담겨 있으면요?
하나는 차감되고 하나는 실패할 때 주문 전체를 어떻게 다룰지 봅니다.
타임세일로 한 상품에 초당 수만 건이 몰리면요?
한 행에 몰리는 차감이 어디서 병목이 되는지 봅니다.
이 다음 판단은 책에서 이어집니다
책은 값을 잃는 틈을 어디서 없앨지 정하고, 실제 요청 흐름과 그래도 남는 위험을 어떻게 다룰지까지 이어 갑니다.
08장에서 이어지는 것
- 값을 잃는 틈을 없애는 위치
- 실제 요청이 흐르는 순서
- 그래도 남는 위험
- 넣지 말아야 할 데이터