가상 면접 사례로 배우는 대규모 시스템 설계 기초 2 - 호텔 예약 시스템을 정리한 내용입니다.

1. 설계 범위 확정

[1] 규모 추정

  1. 요구 사항
    • 5000개의 호텔에 100만 개 객실을 갖춘 호텔 체인을 위한 웹사이트 를 구축한다.
    • 평균적으로 객실이 70% 가 사용 중이고, 평균 투숙 기간은 3일로 가정한다.
    • 대략 10% 사용자가 다음 단계로 진행하고, 90% 사용자는 최종 단계에 도달하기 전에 이탈
  2. 결론
    • 일일 예상 건수 : 1백만 * 0.7 / 3 = 233,333 (올림 하여 약 24,000)
    • 초당 예약 건수(TPS) : 240,000 / 10^5(하루에 10^5초로 계산) =~ 3
      • 객실 상세 QPS = 300
      • 예약 상세 QPS = 30
      • 객실 예약 QPS = 3

 

[2] 예약 기능 요구사항

  1. 대금 결제 방식 : 대금은 예약 시 지불, 도착 시 지불 중 예약 시 지불을 선택한다.
  2. 예약 방식
    • 예약 취소가 가능하다.
    • 10% 초과 예약이 가능하다.
    • 객실 가격은 유동적이다.

 

2. 데이터 모델 설정

[1] 데이터 베이스 설정 기준

  1. 시스템 질의 내용
    1. 호텔 상세 정보 확인
    2. 지정 날짜 범위에 사용 가능한 객실 유형 확인
    3. 예약 정보 기록
    4. 예약 내역 또는 과거 예약 이력 정보 조회
  2. 데이터 베이스 RDB 선택 이유
    1. 읽기 빈도가 쓰기 연산에 비해 높은 작업흐름이다.
    2. ACID 지원 (트랜잭션 지원)
    3. 데이터를 쉽게 모델링 할 수 있음

 

[2] 상태 천이도 다이어그램 (state machine diagram)

  • 상태의 흐름 변경을 확인하는데 도움이 된다.

 

 

 

3. 상세 고려사항

[1] 동시성 문제

  1. 발생할 수 있는 케이스
    1. 같은 사용자가 예약 버튼을 여러 번 누를 수 있다.
    2. 여러 사용자가 같은 객실을 동시에 예약하러 할 수 있다.
  2. 해결 방안
    • 클라이언트 측 구현 : 클라이언트가 요청 전송 후 예약 버튼 비활성화 처리할 수 있다.
    • 멱등 API : 예약 API 요청에 멱등 키를 추가하는 방안
      • 멱등 키 : 몇 번을 호출해도 같은 결과를 내는 API
    • 비관적 락, 낙관적 락, 데이터 제약 조건 설정
      • 비관적 락 : 갱신 레코드에 락을 걸어 동시 업데이트를 방지한다. 하지만 deadlock 에 빠질 위험이 있고, 확장성이 낮은 단점이 있다.
      • 낙관적 락 : version 또는 timestamp 값을 이용해 어플리케이션에서 동시 업데이트를 방지한다. DB 의 락을 걸지 않는 장점이 있지만 데이터 경쟁이 치열한 상황에서는 성능이 좋지 못한 단점이 있다.
      • 데이터 제약 조건 : 데이터 제약 조건을 위반할 경우 트랜잭션이 중단되고 롤백된다. 구현이 쉽지만 데이터 경쟁이 치열한 경우 실패할 수 있고 DB 벤더사에 의존적인 단점이 있다.

 

[2] 시스템 규모 확장

  1. 발생할 수 있는 케이스
    • 높은 트래픽으로 인한 서버 확장
  2. 고려 사항 및 적용 사항
    1. 데이터베이스 샤딩 : 샤딩 조건을 기준으로 데이터를 분배해 DB 서버의 부하 분산을 줄이는 방법
    2. 캐시 : 캐싱을 사용해 쿼리를 줄여 DB 부하를 줄이고 조회 성능을 높이는 방법
    3. 서비스 간 데이터 일관성 : MSA 의 경우 독립적인 DB 에서 트랜잭션을 보장하기 위한 방법에 대한 고민이 필요하다.
      1. 2PC commit : 여러 노드에 걸친 원자적 트랜잭션 실행을 보증하는 데이터베이스 프로토콜이다.
      2. 사가(saga) : 각 노드에 국지적으로 발생하는 트랜잭션을 하나로 묶는 것을 말한다. 한 트랜잭션 실패하면 사가는 이전 트랜잭션의 결과를 전부 되돌리는 트랜잭션들을 순차적으로 실행한다.

 

2PC 는 한 트랜잭션을 통해 ACID 속성을 만족시키는 개념인 반면 사가는 각 단계가 하나의 트랜잭션이라서 결과적 일관성(eventual consistency) 를 의존하는 방법으로 볼 수 있다.