안녕하세요.

늦은 밤.. 주니어 개발자로서 궁금한 점이 생기어 이렇게 글을 남기게 되었습니다...

현재 진행중인 프로젝트에서 상품 테이블이 있고 상품별 판매수량이 있으며 일괄이 아닌 낱개 판매가 가능한 상품입니다.

이러한 경우에 초당 3000명이 결제할 수 있고 1분 내에 18만명 정도가 결제가능한 시스템을 만들고자 할 때, 시스템 아키텍처를 어떻게 가져가야 할 지 모르겠습니다 ㅠㅠ

1. 트랜잭션 시작
2. 상품 조회 (비관적 락 적용, select for update)
3. 상품 수량 마이너스 처리
4. 결제 API 호출
5. 결제 API 200 OK 시, 트랜잭션 종료
6. 결제 API 200 OK 아닐 시, 예외 발생하여 롤백처리

비즈니스 로직은 위처럼 되어있고  비관적 락, 낙관적 락 둘 다 적용하여도 퍼포먼스가 제대로 안 나오는 상황입니다 ㅠㅠ

고민해본 결과, 레디스를 도입해서 아래 플로우를 생각해봤습니다.

1. Redis에 상품별 판매가능 수량을 미리 캐싱
2. 트랜잭션 시작
3. Redis 상품수량 조회 + decrease 원자적 연산 수행
4. 결제 API 호출
5. 결제 API 200 OK 시, 트랜잭션 종료
- 재고처리 이벤트 발행하여 DB 데이터 싱크
6. 결제 API 200 OK 아닐 시, Redis 판매수량 increase

다만 이렇게 되면 레디스 상품 수량을 decr 한 다음 서버가 죽어버리면 판매수량 데이터가 일치하지 않는 경우가 있어 옳은 방법인지 모르겠습니다..

고수 개발자님의 인사이트를 공유해주시면 감사하겠습니다 ㅠㅠ