시스템 설계
큰 서비스를 어떻게 나누고 늘리고 바꿔 가는지를 기초, 설계 사례, 소프트웨어 아키텍처, 데이터 중심 설계, 게임 서버로 나눠 정리했다. 정평 있는 책들이 다루는 주제를 지도로 삼되 설명과 그림은 직접 썼다.
기초
규모를 어림하고, 한 대에서 여러 대로 늘리고, 다시 쓰는 부품을 익힌다
- 규모 확장의 단계서버 한 대에서 시작해 사용자가 늘 때마다 무엇을 덧붙이는지 따라간다. 로드 밸런서, 복제, 캐시, CDN, 무상태 계층, 메시지 큐, 샤딩이 차례로 등장한다.수직·수평 확장 · 로드 밸런서 · 읽기 복제본 · 캐시 · CDN · 무상태 웹 계층 · 여러 데이터센터 · 메시지 큐 · 로그·지표·자동화 · 샤딩
- 설계 면접과 개략 추정막연한 문제를 범위가 정해진 설계로 바꾸는 진행 순서와, 봉투 뒷면 계산으로 규모를 어림하는 법이다.개략 추정 · 설계 질문의 네 단계 · 2의 거듭제곱 · 지연 시간 숫자 · 가용성과 9의 개수 · QPS·저장량 추정
- 설계의 부품어느 설계에나 다시 쓰이는 부품들이다. 처리율 제한, 일관된 해싱, 키-값 저장소, 고유 ID 생성, 캐시와 로드 밸런서, API 게이트웨이와 서킷 브레이커.처리율 제한 · 토큰 버킷 · 일관된 해싱 · 키-값 저장소 · 고유 ID · 누출 버킷 · 창 카운터 · 정족수와 hinted handoff · 머클 트리 · L4·L7 로드 밸런싱 · 캐시 쓰기 방식 · 캐시 쇄도 · API 게이트웨이와 BFF · 시간 제한과 재시도 · 서킷 브레이커 · 벌크헤드
설계 사례
자주 나오는 서비스를 직접 설계해 보며 부품을 고르는 판단을 연습한다
- 설계 사례: 웹 서비스URL 단축, 웹 크롤러, 알림, 뉴스 피드처럼 읽기와 쓰기 비율이 서로 다른 웹 서비스를 설계하며 부품을 고르는 법이다.URL 단축 · 웹 크롤러 · 알림 시스템 · 뉴스 피드 · base62 코드 · 301·302 리다이렉트 · robots.txt · 중복 제거 · 지수 백오프와 지터 · 팬아웃
- 설계 사례: 실시간과 위치채팅, 검색어 자동완성, 근처 장소·친구 찾기, 지도처럼 지연에 민감하고 위치를 다루는 서비스다.채팅 · WebSocket · 프레즌스 · 검색어 자동완성 · 상위 k 트라이 · 근처 장소 찾기 · 지오해시 · 사분 트리 · S2·H3 · 근처 친구 · 지도 타일 · 경로와 ETA
- 설계 사례: 미디어와 파일동영상 스트리밍, 파일 동기화, 객체 저장소, 이메일처럼 큰 데이터를 나르고 오래 보관하는 서비스다.동영상 스트리밍 · 적응형 비트레이트 · HLS·DASH · 파일 동기화 · 블록 해시와 중복 제거 · 동기화 충돌 · 오브젝트 저장소 · 메타데이터 분리 · 소거 코딩 · 이메일 서비스 · SMTP·IMAP·JMAP
- 설계 사례: 데이터 파이프라인메시지 큐, 지표 모니터링, 광고 클릭 집계, 실시간 순위표처럼 끊임없이 들어오는 이벤트를 모으고 세는 시스템이다.분산 메시지 큐 · 파티션 로그와 오프셋 · 컨슈머 그룹 · 전달 보장 · 지표 모니터링 · pull과 push · 알림 규칙 · 광고 클릭 집계 · 윈도와 워터마크 · 대사 · 실시간 순위표 · Redis 정렬 집합
- 설계 사례: 정확성이 중요한 시스템호텔 예약, 결제, 전자 지갑, 증권 거래소처럼 한 번의 실수가 돈이 되는 시스템이다. 멱등성, 이중 기입, 이벤트 소싱이 핵심이다.호텔 예약 · 결제 · 전자 지갑 · 증권 거래소 · 멱등 키 · 낙관적·비관적 잠금 · 결제 상태 기계 · 이중 기입 원장 · 대사 · 샤드를 건너는 이체 · 호가창 · 시퀀서와 결정적 매칭
소프트웨어 아키텍처
무엇을 기준으로 나누고, 어떤 스타일을 고르고, 어떻게 계속 바꿀 수 있게 하나
- 아키텍처 특성과 결정성능·확장성·가용성 같은 아키텍처 특성을 고르고, 트레이드오프를 따져 결정하고, 그 결정을 기록으로 남기는 법이다.아키텍처 특성 · 트레이드오프 분석 · ADR · 아키텍트의 역할 · 아키텍처의 네 요소 · 운영·구조·횡단 특성 · 명시적·암묵적 특성 · 특성 측정
- 모듈성과 결합시스템을 어디서 나누느냐가 바꾸기 쉬운 정도를 정한다. 응집과 결합, 커넥서스, 아키텍처 퀀텀으로 나눔을 잰다.응집과 결합 · 커넥서스 · 아키텍처 퀀텀 · 정보 은닉 · 구심·원심 결합 · 불안정성·추상성 · 주계열 거리 · 기술 분할·도메인 분할
- 아키텍처 스타일계층형부터 마이크로서비스까지 대표적인 아키텍처 스타일이 무엇을 얻고 무엇을 내주는지 비교한다.계층형 · 마이크로커널 · 이벤트 기반 · 마이크로서비스 · 파이프라인 · 모듈러 모놀리스 · 분산 컴퓨팅의 오류 · 서비스 기반 · 오케스트레이션 SOA · 공간 기반 · 스타일 고르기
- 분해와 분산 데이터서비스를 얼마나 잘게 나눌지, 데이터를 어떻게 쪼갤지, 여러 서비스에 걸친 일을 사가로 어떻게 마무리할지 다룬다.서비스 세분성 · 데이터 소유권 · 사가 · 보상 트랜잭션 · 쪼개는 힘·합치는 힘 · 2PC와 사가 · 오케스트레이션·코레오그래피 · 트랜잭셔널 아웃박스 · 계약 · 소비자 주도 계약 · 코드 재사용
- 진화적 아키텍처요구가 바뀌어도 망가지지 않게, 지켜야 할 특성을 자동으로 검사하는 적합성 함수와 점진적 변경으로 아키텍처를 키우는 법이다.적합성 함수 · 점진적 변경 · 스트랭글러 피그 · 콘웨이 법칙 · ArchUnit 의존 규칙 · 지연 예산 · 배포 파이프라인 · 기능 토글 · 확장–축소 이전 · 팀 토폴로지
데이터 중심 설계
데이터의 모양과 인코딩, 분산 환경의 일관성과 시간, 배치와 스트림
- 데이터 모델과 인코딩관계·문서·그래프 모델 가운데 무엇을 고를지, 데이터를 바이트로 바꾸는 형식과 스키마가 바뀌어도 서로 읽히게 하는 법이다.데이터 모델 · 스키마 검사 시점 · 텍스트 형식 · 이진 인코딩 · 스키마 진화 · 데이터 흐름 · REST·GraphQL·gRPC
- 일관성과 시간분산 시스템에서 "최신 값"이 무엇인지 정하는 일관성 모델과, 믿을 수 없는 시계 대신 순서를 정하는 방법이다.선형성 · 인과 일관성 · 세션 보장 · 물리 시계 · 논리 시계 · 펜싱 토큰 · 전체 순서 브로드캐스트
- 배치와 스트림 처리쌓인 데이터를 한꺼번에 처리하는 배치와, 들어오는 대로 처리하는 스트림, 그리고 그 사이를 잇는 로그와 변경 데이터 캡처다.배치 처리 · 맵리듀스 · 데이터플로 엔진 · 메시지 브로커 · 변경 데이터 캡처 · 이벤트 소싱 · 윈도와 스트림 조인 · 정확히 한 번 · 람다·카파 · 백프레셔
게임 서버
온라인 게임을 띄우고 운영하고 플레이어에게 내려보내는 서버와 플랫폼
- 멀티플레이어 서버 설계온라인 게임 서버를 어떻게 나누고 띄우고 늘리는가. 권한 서버, 전용 서버 할당, 세션형과 지속 세계, 지역과 지연을 다룬다.권한 서버 · 전용 서버 플릿 · 샤드·구역·인스턴스 · 틱 레이트 · P2P·릴레이 · 시간 늦추기(TiDi) · 관심 영역(AOI) · 델타 압축 · 지역 선택 · 오토스케일링 · 체크포인트·호스트 이전 · QUIC·WebTransport
- 게임 백엔드와 라이브 서비스게임 밖에서 플레이를 받쳐 주는 서비스들이다. 계정, 매치메이킹, 로비와 친구, 순위표, 인벤토리와 재화, 상점이 여기에 든다.매치메이킹 · 플랫폼 로그인 · Elo·Glicko-2·TrueSkill · 로비·파티·프레즌스 · 순위표 · 재화 원장 · 멱등 키 · 영수증 검증 · 텔레메트리 · 라이브 설정 · 백엔드 서비스
- 게임 배포와 서빙완성한 게임을 플랫폼에 올리고, 패치를 빠르게 내려보내고, 운영 중에 설정을 바꾸는 법이다. 클라우드 게이밍도 다룬다.플랫폼 스토어 · 패치와 CDN · 라이브 옵스 · 클라우드 게이밍 · 콘솔 인증 · 디포와 브랜치 · 델타 패치 · 원격 설정·기능 플래그 · 단계적 출시 · 킬 스위치 · 강제 업데이트
책 목차와 대조
설계·아키텍처 책의 장마다 어느 노트가 맡는지 대조했다. 책의 내용을 옮기지 않고, 같은 주제를 공개 자료로 다시 설명했다.
Alex Xu, System Design Interview Vol. 1 — 가상 면접 사례로 배우는 대규모 시스템 설계 기초 · 16장
장 목록 — ByteByteGo 강의 목차(1·2권 합본)
| 장 | 노트 |
|---|---|
| Scale From Zero To Millions Of Users | 규모 확장의 단계 |
| Back-of-the-envelope Estimation | 설계 면접과 개략 추정 |
| A Framework For System Design Interviews | 설계 면접과 개략 추정 |
| Design A Rate Limiter | 설계의 부품 |
| Design Consistent Hashing | 설계의 부품 |
| Design A Key-value Store | 설계의 부품 · 일관성과 시간 |
| Design A Unique ID Generator In Distributed Systems | 설계의 부품 |
| Design A URL Shortener | 설계 사례: 웹 서비스 |
| Design A Web Crawler | 설계 사례: 웹 서비스 |
| Design A Notification System | 설계 사례: 웹 서비스 |
| Design A News Feed System | 설계 사례: 웹 서비스 |
| Design A Chat System | 설계 사례: 실시간과 위치 |
| Design A Search Autocomplete System | 설계 사례: 실시간과 위치 |
| Design YouTube | 설계 사례: 미디어와 파일 |
| Design Google Drive | 설계 사례: 미디어와 파일 |
| The Learning Continues | 규모 확장의 단계 |
Alex Xu·Sahn Lam, System Design Interview Vol. 2 — 가상 면접 사례로 배우는 대규모 시스템 설계 기초 2 · 13장
장 목록 — ByteByteGo 강의 목차(1·2권 합본)
| 장 | 노트 |
|---|---|
| Proximity Service | 설계 사례: 실시간과 위치 |
| Nearby Friends | 설계 사례: 실시간과 위치 |
| Google Maps | 설계 사례: 실시간과 위치 |
| Distributed Message Queue | 설계 사례: 데이터 파이프라인 · 배치와 스트림 처리 |
| Metrics Monitoring and Alerting System | 설계 사례: 데이터 파이프라인 |
| Ad Click Event Aggregation | 설계 사례: 데이터 파이프라인 · 배치와 스트림 처리 |
| Hotel Reservation System | 설계 사례: 정확성이 중요한 시스템 |
| Distributed Email Service | 설계 사례: 미디어와 파일 |
| S3-like Object Storage | 설계 사례: 미디어와 파일 |
| Real-time Gaming Leaderboard | 설계 사례: 데이터 파이프라인 · 게임 백엔드와 라이브 서비스 |
| Payment System | 설계 사례: 정확성이 중요한 시스템 |
| Digital Wallet | 설계 사례: 정확성이 중요한 시스템 · 배치와 스트림 처리 |
| Stock Exchange | 설계 사례: 정확성이 중요한 시스템 |
Mark Richards·Neal Ford, Fundamentals of Software Architecture (1판, 2020) — 소프트웨어 아키텍처 101 · 24장
| 장 | 노트 |
|---|---|
| Introduction | 아키텍처 특성과 결정 |
| Architectural Thinking | 아키텍처 특성과 결정 |
| Modularity | 모듈성과 결합 |
| Architecture Characteristics Defined | 아키텍처 특성과 결정 |
| Identifying Architectural Characteristics | 아키텍처 특성과 결정 |
| Measuring and Governing Architecture Characteristics | 아키텍처 특성과 결정 · 진화적 아키텍처 |
| Scope of Architecture Characteristics | 모듈성과 결합 |
| Component-Based Thinking | 모듈성과 결합 |
| Foundations | 아키텍처 스타일 |
| Layered Architecture Style | 아키텍처 스타일 |
| Pipeline Architecture Style | 아키텍처 스타일 |
| Microkernel Architecture Style | 아키텍처 스타일 |
| Service-Based Architecture Style | 아키텍처 스타일 |
| Event-Driven Architecture Style | 아키텍처 스타일 |
| Space-Based Architecture Style | 아키텍처 스타일 |
| Orchestration-Driven Service-Oriented Architecture | 아키텍처 스타일 |
| Microservices Architecture | 아키텍처 스타일 · 분해와 분산 데이터 |
| Choosing the Appropriate Architecture Style | 아키텍처 스타일 |
| Architecture Decisions | 아키텍처 특성과 결정 |
| Analyzing Architecture Risk | 아키텍처 특성과 결정 |
| Diagramming and Presenting Architecture | 아키텍처 특성과 결정 |
| Making Teams Effective | 아키텍처 특성과 결정 |
| Negotiation and Leadership Skills | 아키텍처 특성과 결정 |
| Developing a Career Path | 아키텍처 특성과 결정 |
Neal Ford 외, Software Architecture: The Hard Parts (2021) — 소프트웨어 아키텍처 The Hard Parts · 15장
| 장 | 노트 |
|---|---|
| What Happens When There Are No "Best Practices"? | 아키텍처 특성과 결정 |
| Discerning Coupling in Software Architecture | 모듈성과 결합 |
| Architectural Modularity | 모듈성과 결합 · 분해와 분산 데이터 |
| Architectural Decomposition | 분해와 분산 데이터 |
| Component-Based Decomposition Patterns | 분해와 분산 데이터 |
| Pulling Apart Operational Data | 분해와 분산 데이터 |
| Service Granularity | 분해와 분산 데이터 |
| Reuse Patterns | 분해와 분산 데이터 |
| Data Ownership and Distributed Transactions | 분해와 분산 데이터 |
| Distributed Data Access | 분해와 분산 데이터 |
| Managing Distributed Workflows | 분해와 분산 데이터 · 아키텍처 스타일 |
| Transactional Sagas | 분해와 분산 데이터 |
| Contracts | 분해와 분산 데이터 · 데이터 모델과 인코딩 |
| Managing Analytical Data | 배치와 스트림 처리 |
| Build Your Own Trade-Off Analysis | 아키텍처 특성과 결정 |
Neal Ford 외, Building Evolutionary Architectures (2판, 2022) — 진화적 아키텍처 · 9장
| 장 | 노트 |
|---|---|
| Evolving Software Architecture | 진화적 아키텍처 |
| Fitness Functions | 진화적 아키텍처 |
| Engineering Incremental Change | 진화적 아키텍처 |
| Automating Architectural Governance | 진화적 아키텍처 |
| Evolutionary Architecture Topologies | 진화적 아키텍처 · 모듈성과 결합 |
| Evolutionary Data | 진화적 아키텍처 |
| Building Evolvable Architectures | 진화적 아키텍처 |
| Evolutionary Architecture Pitfalls and Antipatterns | 진화적 아키텍처 |
| Putting Evolutionary Architecture into Practice | 진화적 아키텍처 |
Martin Kleppmann, Designing Data-Intensive Applications (1판, 2017) — 데이터 중심 애플리케이션 설계 · 12장
| 장 | 노트 |
|---|---|
| Reliable, Scalable, and Maintainable Applications | 아키텍처 특성과 결정 · 규모 확장의 단계 |
| Data Models and Query Languages | 데이터 모델과 인코딩 |
| Storage and Retrieval | 데이터 모델과 인코딩 |
| Encoding and Evolution | 데이터 모델과 인코딩 |
| Replication | 일관성과 시간 |
| Partitioning | 규모 확장의 단계 · 설계의 부품 |
| Transactions | 일관성과 시간 |
| The Trouble with Distributed Systems | 일관성과 시간 |
| Consistency and Consensus | 일관성과 시간 |
| Batch Processing | 배치와 스트림 처리 |
| Stream Processing | 배치와 스트림 처리 |
| The Future of Data Systems | 배치와 스트림 처리 |