Post

[ICTicket] - 분산 락 key 개선

문제 상황


  • 분산 락을 적용하고 key를 하나로 관리하는 상태임을 발견. 이는 Seat 테이블 자체에 락을 거는 느낌으로, 요청들이 서로 다른 공연의 좌석을 선택하려고 하더라도 모두 하나의 key를 기다리는 상황이라 비효율적이라고 판단

해결 방법


  • 공연의 회차별로 하나의 Key를 공유하게 설정하여, 같은 회차의 좌석 예매에 대한 요청끼리 Key 획득을 기다리도록 만들어 효율성을 높였다.

추가적인 고민


  • 처음에 각각의 row별로 key를 생성해서 관리할 수 있도록 설정하고자 했다. 하지만, 요구사항 상 한번에 여러 개의 좌석을 예매해야 하는 상황에서 구조적으로 이를 구현하는데 어려움이 있었다. 락을 먼저 획득하고, 트랜잭션이 실행되어서 한번에 여러 개 좌석이 예약되거나 롤백 되도록 해야하기 때문이다.
  • performance-1-session-1-seat-1 이렇게 키를 관리하려 했으나, 좌석 번호 여러개를 한번에 받으면, 락을 획득하는 과정에서 seat-1, seat-2 , seat-3 처럼 여러개의 키를 한번에 받아야 한다. 이 상황에서 만약 두 개 이상의 요청이 서로의 키를 필요로 하게 된다면 데드락이 발생할 수 있을 것이라 생각했고, 또 A유저가 1,2,3,4,5 를 요청하고, B유저가 5,6,7을 요청했을 때, A가 1,2,3 락을 획득하는 중에 B가 5를 가져가면 B유저를 A가 기다리는 문제가 발생하는 등 구조적으로 어려움이 있었다.