가상 면접 사례로 배우는 대규모 시스템 설계 기초 2 - 호텔 예약 시스템을 정리한 내용입니다.
1. 설계 범위 확정
[1] 규모 추정
- 요구 사항
- 5000개의 호텔에 100만 개 객실을 갖춘 호텔 체인을 위한 웹사이트 를 구축한다.
- 평균적으로 객실이 70% 가 사용 중이고, 평균 투숙 기간은 3일로 가정한다.
- 대략 10% 사용자가 다음 단계로 진행하고, 90% 사용자는 최종 단계에 도달하기 전에 이탈
- 결론
- 일일 예상 건수 : 1백만 * 0.7 / 3 = 233,333 (올림 하여 약 24,000)
- 초당 예약 건수(TPS) : 240,000 / 10^5(하루에 10^5초로 계산) =~ 3
- 객실 상세 QPS = 300
- 예약 상세 QPS = 30
- 객실 예약 QPS = 3
[2] 예약 기능 요구사항
- 대금 결제 방식 : 대금은 예약 시 지불, 도착 시 지불 중 예약 시 지불을 선택한다.
- 예약 방식
- 예약 취소가 가능하다.
- 10% 초과 예약이 가능하다.
- 객실 가격은 유동적이다.
2. 데이터 모델 설정
[1] 데이터 베이스 설정 기준
- 시스템 질의 내용
- 호텔 상세 정보 확인
- 지정 날짜 범위에 사용 가능한 객실 유형 확인
- 예약 정보 기록
- 예약 내역 또는 과거 예약 이력 정보 조회
- 데이터 베이스 RDB 선택 이유
- 읽기 빈도가 쓰기 연산에 비해 높은 작업흐름이다.
- ACID 지원 (트랜잭션 지원)
- 데이터를 쉽게 모델링 할 수 있음
[2] 상태 천이도 다이어그램 (state machine diagram)
- 상태의 흐름 변경을 확인하는데 도움이 된다.
3. 상세 고려사항
[1] 동시성 문제
- 발생할 수 있는 케이스
- 같은 사용자가 예약 버튼을 여러 번 누를 수 있다.
- 여러 사용자가 같은 객실을 동시에 예약하러 할 수 있다.
- 해결 방안
- 클라이언트 측 구현 : 클라이언트가 요청 전송 후 예약 버튼 비활성화 처리할 수 있다.
- 멱등 API : 예약 API 요청에 멱등 키를 추가하는 방안
- 멱등 키 : 몇 번을 호출해도 같은 결과를 내는 API
- 비관적 락, 낙관적 락, 데이터 제약 조건 설정
- 비관적 락 : 갱신 레코드에 락을 걸어 동시 업데이트를 방지한다. 하지만 deadlock 에 빠질 위험이 있고, 확장성이 낮은 단점이 있다.
- 낙관적 락 : version 또는 timestamp 값을 이용해 어플리케이션에서 동시 업데이트를 방지한다. DB 의 락을 걸지 않는 장점이 있지만 데이터 경쟁이 치열한 상황에서는 성능이 좋지 못한 단점이 있다.
- 데이터 제약 조건 : 데이터 제약 조건을 위반할 경우 트랜잭션이 중단되고 롤백된다. 구현이 쉽지만 데이터 경쟁이 치열한 경우 실패할 수 있고 DB 벤더사에 의존적인 단점이 있다.
[2] 시스템 규모 확장
- 발생할 수 있는 케이스
- 높은 트래픽으로 인한 서버 확장
- 고려 사항 및 적용 사항
- 데이터베이스 샤딩 : 샤딩 조건을 기준으로 데이터를 분배해 DB 서버의 부하 분산을 줄이는 방법
- 캐시 : 캐싱을 사용해 쿼리를 줄여 DB 부하를 줄이고 조회 성능을 높이는 방법
- 서비스 간 데이터 일관성 : MSA 의 경우 독립적인 DB 에서 트랜잭션을 보장하기 위한 방법에 대한 고민이 필요하다.
- 2PC commit : 여러 노드에 걸친 원자적 트랜잭션 실행을 보증하는 데이터베이스 프로토콜이다.
- 사가(saga) : 각 노드에 국지적으로 발생하는 트랜잭션을 하나로 묶는 것을 말한다. 한 트랜잭션 실패하면 사가는 이전 트랜잭션의 결과를 전부 되돌리는 트랜잭션들을 순차적으로 실행한다.
2PC 는 한 트랜잭션을 통해 ACID 속성을 만족시키는 개념인 반면 사가는 각 단계가 하나의 트랜잭션이라서 결과적 일관성(eventual consistency) 를 의존하는 방법으로 볼 수 있다.
'architecture' 카테고리의 다른 글
[데이터 중심 애플리케이션 설계] 일관성과 합의 (0) | 2024.06.19 |
---|---|
[데이터 중심 애플리케이션 설계] 분산 시스템의 골칫거리 (1) | 2024.06.08 |
[가상 면접 사례로 배우는 대규모 시스템 설계 기초 2] 광고 클릭 이벤트 집계 (1) | 2024.05.11 |
[가상 면접 사례로 배우는 대규모 시스템 설계 기초 2] 지표 모니터링 및 경보 시스템 (0) | 2024.05.04 |
[가상 면접 사례로 배우는 대규모 시스템 설계 기초 2] 분산 메시지 큐 설계 (0) | 2024.04.29 |