설계 면접 문제 08 · 3부 동시에 들어올 때

재고 동시성 면접 질문: 동시 주문에 재고 차감이 사라지는 순간

시스템 디자인 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를 씁니다. 주문은 두 건 나갔는데 재고는 한 개만 줄었습니다. 차감 하나가 증발합니다.

이 일이 마지막 재고 근처에서 벌어지면 남은 것보다 많이 팔립니다. 화면에서 음수를 숨기는 것으로는 이미 받은 주문이 사라지지 않습니다.

떨어지는 답은 이런 모양입니다

  • 읽어 와서 코드에서 빼고 덮어씁니다.
  • 두 요청이 같은 값을 읽는 경우를 생각하지 못합니다.
  • 재고가 음수가 되면 화면에서 숨기면 된다고 답합니다.

면접관은 여기서 멈추지 않습니다

  1. 한 주문에 상품이 여러 개 담겨 있으면요?

    하나는 차감되고 하나는 실패할 때 주문 전체를 어떻게 다룰지 봅니다.

  2. 타임세일로 한 상품에 초당 수만 건이 몰리면요?

    한 행에 몰리는 차감이 어디서 병목이 되는지 봅니다.

VOL.1 · 08장

이 다음 판단은 책에서 이어집니다

책은 값을 잃는 틈을 어디서 없앨지 정하고, 실제 요청 흐름과 그래도 남는 위험을 어떻게 다룰지까지 이어 갑니다.

08장에서 이어지는 것

  • 값을 잃는 틈을 없애는 위치
  • 실제 요청이 흐르는 순서
  • 그래도 남는 위험
  • 넣지 말아야 할 데이터
시스템 디자인 Vol.1 보러 가기 →

매일 쓰는 화면에서 나온 설계 문제 22개 · 263쪽 · 현직 엔지니어와 30분 모의면접

22문제 전체 보기