- 한 주문당 구매할 상품
4번 상품(길럭시북 그래파이트 15.6인치 코어 i5 - 512GB) - 2개
5번 상품(김럭시북9 그려파이트 14인치 코어 16GB - 2TB - 인도우11 PRO) - 1개
// 예시
주문1: {
주문정보: { ... },
주소: { ... },
상품리스트: [ { 4번 상품, 수량 2개 }, { 5번 상품, 수량 1개 } ]
}
- 위의 주문을 200건 동시에 요청할 계획 입니다.
- 주문 테이블은 현재 어떤 주문도 받지 않은 상태 입니다.
한 주문당 4번의 상품을 2개씩 주문하니
-
4번의 상품이 재고가 0개가 되는 시점은 30개 - (2개 * 15번 주문) =
재고 0개
-> 즉, 15개의 주문이 들어왔을 때4번
상품의 재고가0
개, 상태가SOLD_OUT
되고
재고 수량은 더 이상 마이너스로 줄어들지 않기를 기대합니다. -
4번의 재고가 0개가 되는 시점에
5번 상품은 20개 - (1개 * 15번 주문) =5개
-> 즉, 하나로 묶인 주문이니 4번의 재고가 부족할 때 주문 자체가 불가능 해야 하므로
5번
상품의 재고는5개
의 재고가 남을 것으로 기대합니다.
-
스레드 풀 200개를 준비 합니다.
-
동시 요청 할 200건의 태스크를 준비 합니다.
(한 개의 태스크 당 1건의 주문 - 4번 상품 2개, 5번 상품 1개 ) -
200건의 동시 요청 실행 합니다.
4번
상품 재고0
개, 상태SOLD_OUT
- 기댓 값과 일치 합니다.5번
상품 재고5
개 - 기댓 값과 일치 합니다.
-
200
건의 요청이 한 번에 들어왔을 때 -
주문 요청 자체에서
상품의 상태가SOLD_OUT
임을 확인 한 시점102
개
즉102
개 지점 부터는 더 이상 요청 자체를 받지 않았습니다.
-
4
번 상품의SOLD_OUT
된 시점이 2개씩 주문 * 15 = 0, 즉15
번 째 주문 이므로
실제 주문 처리될 건은15
건, 반려(거절) 처리될 건은87
건으로 기대해 볼 수 있습니다. -
동시 다발로 들어온 주문
102
건 중
실제 주문 받을15
건을 제외 하고 -
나머지
87
건의 주문은 재고가 부족 하였을 것이기 때문에
카프카에 의해 반려 처리 중인 것을 확인합니다.
- 해당 상품이 소진 되었기 때문에
orderReject
토픽을 생산합니다.
orderReject
토픽을 소비합니다. 해당 주문 건을 찾아 주문 상태를REJECT
로 변경 합니다.
-
200
건의 동시 요청 중 상품 상태가SOLD_OUT
임을 확인 한 시점 부터 요청을 받지 않았으며그 사이엔
102
건의 요청이 들어 왔습니다.
-
최종 결과 주문을 정상적으로 받아야 하는 건수는
15
건 입니다. -
최종 결과 재고 부족으로 주문을 카프카에 의해 반려 처리 되어야 할 건수는
87
건 입니다. -
상품의 재고는
4
번 상품0
개 -SOLD_OUT
,5
번 상품5
개 입니다.
- 주문 상품 테이블 - 주문 카운트, 주문 반려 카운트
- 주문 - 전체
- 상품 테이블
-
orderReject
토픽을 소비하는 다른Queue System
을 추가하여 반려된87
건의 주문에 대해서는브라우저로 알림을 보내주는
SSE(Server Sent Events)
기능이나직접 사용자에게 전달 하는 다른 메시징 시스템을 활용하여
사용자에게 주문이 재고 부족으로 거절/반려 처리 되었다는 알림을 보낼 수 있겠습니다.