Spring Boot

[Spring] Lock을 이용한 동시성 제어 - 낙관적락/비관적락/분산락 (2)적용

kittity 2024. 12. 27. 23:37

콘서트 예약 서비스에서 발생할 수 있는 동시성 문제를 파악해보고 앞서 살펴본 동시성 제어에 대하여 적용해보았다. 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