[Review] 시스템 설계 기초 2 - 호텔 예약 시스템

《가상 면접 사례로 배우는 대규모 시스템 설계 기초 2》 의 7장 '호텔 예약 시스템' 에 대한 스터디 후기입니다.


1. MSA


이 책에서는  "총 5,000개 호텔, 100만 개의 객실이 있다"고 전제하며 마이크로 서비스 아키텍처를 사용한 호텔 예약 시스템을 제시했습니다.

모놀리식으로도 가능한 것 같은데 굳이 MSA를 선택한 이유가 있나 의문이 있었고,
아쉽게도 MSA 도입 근거에 대한 내용은 없어 개인적으로 아쉬웠습니다.

스터디에서는 자연스레 MSA의 필요성에 대해 논의했는데요,
처음부터 서비스를 분리하여 개발했다가 오버엔지니어링이 되었던 사례와
반대로, 모놀리식 내에서 로직이 복잡하게 얽혀있어 분리하기 어려웠던 사례를 들을 수 있었습니다.

현재 저는 기존 서비스에서 특정 도메인을 분리하는 작업을 하고 있습니다. 분리를 하게 된 계기 중 하나는, 특정 도메인을 위한 예외 로직들이 비대해지며 서비스간 역할 경계가 모호해졌기 때문입니다.
만약 이 작업을 계속 미루었다면 핵심 로직과 부가 로직이 혼재되어 분리하기가 더 어려웠을 것 같아요.

모놀리식에서 서비스를 점진적으로 분리할 때
시스템의 복잡도가 한계치에 다다르기 전 분리 타이밍도 중요하게 고려해야하는 사항이라는 생각이 들었습니다.


2. 분산 트랜잭션


MSA에서는 하나의 연산에서 여러 DB에 접근해야하는 일이 발생합니다.

분산 환경에서 데이터 일관성을 유지하는 대표적인 방법으로 Two Phase Commit과 SAGA Pattern이 소개되었습니다.

(1) Two Phase Commit (2PC)

[Review] 시스템 설계 기초 2 - 호텔 예약 시스템
출처: Wikipedia, Two-phase commit protocol


프로세스는 다음과 같습니다.

Phase 1.
1. Coordinator가 참여자에게 데이터와 연산 실행 명령을 보낸다.
2. 참여자들은 실제로 작업을 수행하고, 변경 사항을 디스크 로그에 기록한다.
3. 최종 커밋 준비가 완료/문제 발생 상태를 Coordinator에게 응답한다.

Phase 2.
1-3 의 결과가
- 모두 Yes인 경우: 모든 참여자에게 Commit 명령을 보낸다.
- 하나라도 No 혹은 Timeout: 모든 참여자에게 Rollback 명령을 보낸다. 1-2 에서 수행한 디스크 로그를 활용한다.


(2) Saga Pattern

논리적으로 하나인 트랜잭션을 여러 로컬 트랜잭션으로 나누어 개별 실행하되,
실패 시 보상 트랜잭션을 통해 데이터 일관성을 맞추는 방법입니다.

(a) Choreography 기반
[Review] 시스템 설계 기초 2 - 호텔 예약 시스템 - 이미지 2
출처: AWS, Saga choreography pattern


(b) Orchestration 기반 : 
[Review] 시스템 설계 기초 2 - 호텔 예약 시스템 - 이미지 3
출처: AWS, Saga orchestration pattern