주문 처리 중에 락을 걸었지만, 결제가 완료된 이후에 상품 수량이 업데이트되어 수량이 1개인 상품이라도 주문서가 여러 개 생성될 수 있습니다.
락을 걸어놨지만 결제가 완료된 시점에서 수량이 업데이트 되기 때문에 수량이 1개라고 해도 주문서가 100개가 생길 수가 있다.
a와 b의 주문서가 생기고 a와 b 둘 다 결제창에 진입한다. 둘 다 결제가 진행 된 후에 수량이 1개만 줄어들 위험이 있다.
지금은 결제 모듈로 카카오 API를 사용하고 있는데 다른 결제 모듈들을 가지고 왔을때 그 모듈들에도 락을 걸어줘야 한다.
1차 해결 방안
분산 락을 적용할 정확한 시점을 고민해보고 주문하기에 락을 걸어서 동시성을 제어 했다.
1차 해결 방안 효과
주문하기 자체에 락을 걸어서 재고가 1일 때 A,B가 동시에 주문해도 한 명만 결제가 될 수 있도록 개선했다.
100명 1000명이 시도해도 재고가 10개면 10개만 받고 깔끔하게 10명만 결제하기로 넘어갈 수 있다.
2차 트러블 슈팅
2차 문제 상황
개선된 코드에서 발생한 문제
수량이 100개인 상품을 어떤 유저 한명이 100개를 주문해놓고 결제를 안하면 다른사람이 결제를 할 수가 없다. ex) 주문량 빌런
2차 해결 방안
스케줄링을 통한 문제 해결
주문하기 버튼을 클릭하면 "5분 이내에 결제가 완료되지 않으면 주문이 자동으로 취소됩니다."라는 팝업 메시지를 표시한다. 이와 함께 스케줄링 기능을 도입하여, 주문 후 5분 이내에 결제가 이루어지지 않은 경우 해당 주문을 자동으로 취소 처리하고 주문된 수량만큼 재고를 복원한다.
2차 해결 방안 효과
미결제 주문으로 인한 재고 낭비와 판매 기회 손실을 최소화할 수 있게 되었다.
사용자 경험 측면에서도 결제 완료에 대한 적절한 안내를 제공하고, 보다 효율적인 주문 처리 흐름을 제공할 수 있게 되었다.