콘서트 예약 서비스에서 발생할 수 있는 동시성 문제를 파악해보고 앞서 살펴본 동시성 제어에 대하여 적용해보았다. Lock을 이용한 동시성 제어 개념은 이전 글을 참고하면 된다.
콘서트 예약 서비스 기능 중 동시성 제어가 필요한 기능으로 다음 항목을 선정하였다.
- 콘서트 좌석 예약
- 포인트 충전
- 포인트 사용
각각에 대해 적합한 방법을 고민한 결과 다음과 같다. 실제 구현 코드는 GitHub에 있다.
1. 콘서트 좌석 예약
- 적절한 방법: 분산락(pub/sub) > 비관적락 > 낙관적락
- 선택한 방법: 분산락(pub/sub) + 낙관적락
- 선택 이유
콘서트 예매는 동시 접속자가 많기 때문에 충돌이 많이 발생할 수 있다. 따라서 동시성 이슈 발생 가능성이 매우 높다. 또한 분산 환경에서의 동시성 제어가 필요하다.
분산 환경에서 동시성 제어와 DB 부하를 줄이기 위해서는 분산락이 가장 적절하다고 생각한다. 그리고 예매 실패 시에 retry를 할 필요가 없으므로 pub/sub 방식이 적절하다고 생각한다.
Redisson을 사용하여 구현할 경우, 발생할 수 있는 문제에 대해 콘서트 좌석 예매 특성상 '낙관적락'을 추가로 적용하여 보완할 수 있다.
보완 방법으로 비관적락이 아닌 낙관적락을 선택한 이유는 분산락을 사용하기 때문에 충돌이 발생할 가능성이 낮고 비관적락보다 낙관적락이 빠르게 처리할 수 있기 때문이다.
2. 포인트 충전
- 적절한 방법: 낙관적락 > 비관적락 > 분산락
- 선택한 방법: 낙관적락
- 선택 이유
포인트 충전을 동시에 요청하는 경우는 거의 없으므로, 충돌이 잘 발생하지 않는다. 동시 요청에 대해 하나만 성공해도 되며 잘못된 동시 요청 처리에 대한 문제를 방지할 수 있다. 이에 따라 retry를 하거나 트랜잭션이 대기하지 않아도 된다고 생각되어 동시성이 낮을 경우 성능이 좋은 낙관적락이 적절하다고 판단했다.
3. 포인트 사용
- 적절한 방법: 비관적락 > 분산락 > 낙관적락
- 선택한 방법: 비관적락
- 선택 이유
동시에 여러 콘서트의 좌석을 결제 요청할 수 있는데 이 경우 전부 처리해야한다. 안전하게 처리하고, user에 대한 데이터에 접근하는 부하를 줄이기 위해 비관적락이 적절하다고 판단했다.
관련글
[Spring] Lock을 이용한 동시성 제어 - 낙관적락/비관적락/분산락 (1)개념
[Spring] Lock을 이용한 동시성 제어 - 낙관적락/비관적락/분산락 (2)적용
관련 코드는 아래 GitHub를 참고해주세요.
GitHub - leehanna602/hhplus-server-construction
Contribute to leehanna602/hhplus-server-construction development by creating an account on GitHub.
github.com
728x90
'Spring Boot' 카테고리의 다른 글
[Spring] Redis를 이용한 대기열 관리 (0) | 2024.12.28 |
---|---|
[Spring] Transaction 분리를 통한 성능 개선 (0) | 2024.12.27 |
[Spring] Lock을 이용한 동시성 제어 - 낙관적락/비관적락/분산락 (1)개념 (1) | 2024.12.26 |
[Spring] RedisSerializer 알고 쓰기! 종류 별 특징과 주의 사항 (0) | 2024.12.04 |
[실전! 스프링 부트와 JPA 활용1] 01. 프로젝트 환경설정 (0) | 2024.07.28 |