🌆
Sunset Archive
GitHubLinkedInBlog
  • litsynp
  • Archives
    • Projects
      • Let's Parking!
      • 맛집몬스터 (JMT Monster)
      • spring-x-demo Projects
    • Articles
      • My Thoughts on GitBook
      • Wake-on-LAN & RDP Setup
    • Learning
      • Languages
        • Rust
          • Useful Links
          • Syntax
          • Pointers
          • Dependencies
          • Logging
          • Phantom Types
          • Iterable
            • Optional Skip
        • Go
          • Useful Links
          • Structures
          • Zero Values
          • Error Handling
          • Dependency Injection
          • Project Layout
        • JavaScript/TypeScript
          • Basics
            • Types
              • [JS] Falsy Values
              • [TS] Types - unknown, any, never
            • Rest Parameters (...)
            • Spread Syntax (...)
            • Destructuing Assignment
            • CJS, AMD, UMD, ESM
          • Advanced
            • Conditional Destructuring Assignment
            • Type Guards
          • Miscellaneous
            • Dependency Injection in JS?
            • ESLint, Prettier, TypeScript
          • Node
            • Useful Links
            • General
              • V8 Engine
              • Version Management: NVM
              • Environment Variables
            • Database
              • Knex
        • C
          • Dynamic Multi-dimensional Arrays
        • Spring
          • General
            • @Import v.s. @ContextConfiguration
            • MessageSource
          • Kotlin+Spring
            • Kotlin Annotations (Use-Site Targets)
            • Handling Null in Request DTO
            • Handling Null in URL
          • Reactive Stack
            • Reactive API with Spring WebFlux
          • Spring Security
            • Google OAuth Setup
          • Spring Batch
            • Bulk Insert
        • Kotlin
          • val/var in Constructor
          • Initializer Blocks
          • Inheritance Modifiers (final, open, abstract)
          • Delegate Pattern
        • Java
          • Serialization
          • Random Number Generation
            • (1) Math.random() v.s. Random
            • (2) Random v.s. ThreadLocalRandom
        • Python
          • Version Management
        • Ruby
          • Installation
          • Getters & Setters
        • Elixir
        • Erlang
        • Flutter
        • AWS
          • AWS CLI
        • Terraform
          • Installation
          • Basics
      • Code
        • OOP
          • The 4 Basic Concepts of OOP
          • The SOLID Principles
          • GRASP
          • Spring POJO
          • Others
        • Functional Programming
          • Currying
          • Higher-Order Function
          • Closure
          • Monad
        • 공변성, 반공변성, 무공변성
        • Others
          • UUID
          • GraphQL
          • Multimedia
            • Streaming
          • Geography
            • 위도 (Latitude), 경도 (Longitude)
      • Tools
        • Nix
        • Mermaid
          • Flowchart
          • Sequence Diagram
          • Class Diagram
          • Entity Relationship Diagrams
        • VSCode
          • VSCode CLI
          • VSCode Extensions
        • JetBrains
          • IntelliJ - Open Projects in Tabs
          • Delete Leftover IDE Directories
        • vim
          • Commands
      • Books
        • 다재다능 코틀린 프로그래밍 (Programming Kotlin)
          • Pt 01. 코틀린으로 스크립팅 하기
            • Ch 01. 코틀린 시작하기
            • Ch 02. Java 개발자를 위한 코틀린 필수 사항
            • Ch 03. 함수를 사용하자
            • Ch 05. 콜렉션 사용하기
        • 오브젝트 (Object)
          • Ch.0 들어가며 - 프로그래밍 패러다임
          • Ch.1 객체, 설계
          • Ch.2 객체지향 프로그래밍
          • Ch.3 역할, 책임, 협력
          • Ch.4 설계 품질과 트레이드오프
          • Ch.5 책임 할당하기
          • Ch.6 메시지와 인터페이스
          • Ch.7 유연한 설계
          • Ch.8 의존성 관리하기
          • Ch.9 유연한 설계
          • Ch.10 상속과 코드 재사용
          • Ch.11 합성과 유연한 설계
          • Ch.12 다형성
          • Ch.13 서브클래싱과 서브타이핑
          • Ch.14 일관성 있는 협력
          • Ch.15 디자인 패턴과 프레임워크
          • End. 마치며 - 나아가기
          • 후기
        • 헤드 퍼스트 디자인 패턴 (Head First Design Patterns)
          • Ch.1 디자인 패턴 소개와 전략 패턴
          • Ch.2 옵저버 패턴
          • Ch.3 데코레이터 패턴
          • Ch.4 팩토리 패턴
          • Ch.5 싱글턴 패턴
          • Ch.6 커맨드 패턴
          • Ch.7 어댑터 패턴과 퍼사드 패턴
          • Ch.8 템플릿 메소드 패턴
          • Ch.9 반복자 패턴과 컴포지트 패턴
          • Ch.10 상태 패턴
          • Ch.11 프록시 패턴
          • Ch.12 복합 패턴
        • 이펙티브 타입스크립트 (Effective TypeScript)
          • Ch.1 타입스크립트 알아보기
            • Item 1 타입스크립트와 자바스크립트의 관계 이해하기
            • Item 2 타입스크립트 설정 이해하기
            • Item 3 코드 생성과 타입이 관계없음을 이해하기
            • Item 4 구조적 타이핑에 익숙해지기
            • Item 5 any 타입 지양하기
          • Ch.2 타입스크립트의 타입 시스템
            • Item 6 편집기를 사용하여 타입 시스템 탐색하기
            • Item 7 타입이 값들의 집합이라고 생각하기
            • Item 1-7 Study Summary
            • Item 8 타입 공간과 값 공간의 심벌 구분하기
            • Item 9 타입 단언보다는 타입 선언을 사용하기
            • Item 10 객체 래퍼 타입 피하기
            • Item 11 잉여 속성 체크의 한계 인지하기
            • Item 12 함수 표현식에 타입 적용하기
            • Item 13 타입과 인터페이스의 차이점 알기
            • Item 14 타입 연산과 제너릭 사용으로 반복 줄이기
            • Item 15 동적 데이터에 인덱스 시그니처 사용하기
            • Item 16 number 인덱스 시그니처보다는 Array, 튜플, ArrayLike를 사용하기
            • Item 17 변경 관련된 오류 방지를 위해 readonly 사용하기
            • Item 18 매핑된 타입을 사용하여 값을 동기화하기
          • Ch.3 타입 추론
            • Item 19 추론 가능한 타입을 사용해 장황한 코드 방지하기
            • Item 20 다른 타입에는 다른 변수 사용하기
            • Item 21 타입 넓히기
            • Item 22 타입 좁히기
            • Item 23 한꺼번에 객체 생성하기
            • Item 24 일관성 있는 별칭 사용하기
            • Item 25 비동기 코드에는 콜백 대신 async 함수 사용하기
            • Item 26 타입 추론에 문맥이 어떻게 사용되는지 이해하기
            • Item 27 함수형 기법과 라이브러리로 타입 흐름 유지하기
          • Ch.4 타입 설계
            • Item 28 유효한 상태만 표현하는 타입을 지향하기
            • Item 29 사용할 때는 너그럽게, 생성할 때는 엄격하게
            • Item 30 문서에 타입 정보를 쓰지 않기
            • Item 31 타입 주변에 null 값 배치하기
            • Item 32 유니온의 인터페이스보다는 인터페이스의 유니온을 사용하기
            • Item 33 string 타입보다 더 구체적인 타입 사용하기
            • Item 34 부정확한 타입보다는 미완성 타입을 사용하기
            • Item 35 데이터가 아닌, API와 명세를 보고 타입 만들기
            • Item 36 해당 분야의 용어로 타입 이름 짓기
            • Item 37 공식 명칭에는 상표를 붙이기
          • Ch.5 any 다루기
            • Item 38 any 타입은 가능한 한 좁은 범위에서만 사용하기
            • Item 39 any를 구체적으로 변형해서 사용하기
            • Item 40 함수 안으로 타입 단언문 감추기
            • Item 41 any의 진화를 이해하기
            • Item 42 모르는 타입의 값에는 any 대신 unknown을 사용하기
            • Item 43 몽키 패치보다는 안전한 타입을 사용하기
            • Item 44 타입 커버리지를 추적하여 타입 안전성 유지하기
          • Ch.6 타입 선언과 @types
            • Item 45 devDependencies에 typescript와 @types 추가하기
            • Item 46 타입 선언과 관련된 세 가지 버전 이해하기
            • Item 47 공개 API에 등장하는 모든 타입을 익스포트하기
            • Item 48 API 주석에 TSDoc 사용하기
            • Item 49 콜백에서 this에 대한 타입 제공하기
            • Item 50 오버로딩 타입보다는 조건부 타입을 사용하기
            • Item 51 의존성 분리를 위해 미러 타입 사용하기
            • Item 52 테스팅 타입의 함정에 주의하기
          • Ch.7 코드를 작성하고 실행하기
            • Item 53 타입스크립트 기능보다는 ECMAScript 기능을 사용하기
            • Item 54 객체를 순회하는 노하우
            • Item 55 DOM 계층 구조 이해하기
            • Item 56 정보를 감추는 목적으로 private 사용하지 않기
            • Item 57 소스맵을 사용하여 타입스크립트 디버깅하기
          • Ch.8 타입스크립트로 마이그레이션하기
            • Item 58 모던 자바스크립트로 작성하기
            • Item 59 타입스크립트 도입 전에 @ts-check와 JSDoc으로 시험해 보기
            • Item 60 allowJS로 타입스크립트와 자바스크립트 같이 사용하기
            • Item 61 의존성 관계에 따라 모듈 단위로 전환하기
            • Item 62 마이그레이션의 완성을 위해 noImplicitAny 설정하기
        • Dive Into Design Patterns
          • 디자인 패턴 소개
          • 소프트웨어 디자인 원칙들
          • 디자인 패턴 목록
          • 유용한 링크
        • 가상 면접 사례로 배우는 대규모 시스템 설계 기초 (System Design Interview)
          • Key Points
          • Real Life Systems
          • Engineering Blogs
        • Node.js 디자인 패턴 바이블 (Node.js Design Patterns 3rd Edition)
        • 리팩터링 2판 (Refactoring: 2nd Ed.)
          • 1장 리팩터링: 첫 번째 예시
          • 2장 리팩터링 원칙
          • 3장 코드에서 나는 악취
          • 4장 테스트 구축하기
Powered by GitBook
On this page
  • 지표
  • 요구사항
  • 트래픽 규모
  • QPS (Query Per Second)
  • 데이터 보관 기간
  • 응답 지연 (Latency)
  • 클라이언트
  • 데이터 관련
  • 캐싱 (Caching)
  • 추가 논의 / 처리 기법 / 키워드
  • ID 생성 방식 (Ch.7 - 분산 시스템을 위한 유일 ID 생성기 설계)
  • 서비스 탐색 (Service Discovery)
  • 개념
  • SPOF (Single Point of Failure)
  • 채팅
  • 비디오 스트리밍 (Ch.14)

Was this helpful?

Edit on GitHub
  1. Archives
  2. Learning
  3. Books
  4. 가상 면접 사례로 배우는 대규모 시스템 설계 기초 (System Design Interview)

Key Points

일종의 노트 개념으로 핵심 포인트만 모아봅니다.

지표

  • 규모 확장성 (서버 1대 → N대), 고가용성 (high availability)

    • 다중화 (replication)

    • 샤딩 (sharding)

      • 작업 대상 데이터의 양을 줄일 수 있다

      • 샤딩 정책 - 데이터를 서버마다 균등하게 배분하는 방법 고안

  • 동시성

    • 이중화/다중화

      • 무상태 (stateless)하게 유지

    • 동기화

      • 동기화 충돌

        • 버저닝

  • 일관성

    • RDB - ACID 보장

    • NoSQL - ACID 기본 지원하지 않음, 프로그래밍 로직으로 대체

  • 응답 속도

    • 시스템의 응답 속도: ~100ms

요구사항

일간 능동 사용자는? 매일 평균 몇 건의 작업을 수행하는지/평균 소비하는 시간이 얼마인지? 각 작업마다 평균 몇 바이트의 데이터가 필요한지?

트래픽 규모

  • 일별 능동 사용자 수(DAU: Daily Active User)

    • 5천만(5M)?

  • 인원 제한은 어느 정도로 해야 하는지?

  • 동시 접속자 수

    • 동시 접속자 수 x 접속 당 필요한 서버 메모리 = 접속에 필요한 서버 메모리

  • CDN (Content Delivery Network)

    • 캐시

    • 국가/지역별 센터에 배치하여 사용자 근거리로 지정해 응답 지연 개선

QPS (Query Per Second)

초당 몇 번의 질의가 들어오는지를 구한다.

최대 QPS ~= QPS * 2

데이터 보관 기간

  • 내용/길이 제한

  • 보관 기한 (10년, … 영원히)

  • 공간 절약 (p.296)

    • 중복 제거(de-dupe) - 두 블록이 같은 블록인지 해시값으로 판단

    • 지능적 백업 전략

      • 한도 설정

      • 중요한 버전만 보관

    • 아카이빙 저장소(cold storage) - 자주 쓰이지 않는 데이터는 아카이빙 (e.g., AWS S3 Glacier)

응답 지연 (Latency)

몇 ms 안에 처리해야하는지?

클라이언트

지원 기기

모바일 앱 / 웹(브라우저) / 스마트 TV / …

데이터 관련

  • 암호화

  • 데이터 유형

    • RDBMS

      • 일반적인 데이터

      • 데이터 가운데 롱 테일(long tail)에 해당하는 부분을 잘 처리하지 못함.

      • 인덱스가 커지면 데이터에 대한 무작위 접근(random access)을 처리하는 비용이 늘어남.

        • e.g., 특정 사용자가 언급된 메시지를 보거나, 특정 메시지로 점프(jump)하여 무작위한 데이터 접근을 하는 경우

    • NoSQL - 자유로움

    • Key-Value Store

      • 수평적 규모확장(horizontal scaling)이 쉬움

      • 데이터 접근 지연 시간(latency) 낮음

      • 많은 안정적인 채팅 시스템이 채택

        • Facebook Messenger - HBase

        • Discord - Cassandra

캐싱 (Caching)

  • 캐시 미스(cache miss) (p.238)

    • 데이터가 캐시에 없는 경우

    • 캐시 서버의 메모리가 부족할 경우

    • 캐시 서버에 장애가 있을 경우

  • 브라우저 캐싱(browser caching) (p.239)

    • cache-control 응답 헤더 활용

    • e.g., 구글 검색 엔진

추가 논의 / 처리 기법 / 키워드

  • 다양한 파일 유형 (확장성)

    • 원본 저장소(original storage) (p.252)

      • 대형 이진 파일 저장소(BLOB: Binary Large Object storage) - 이진 데이터를 하나의 개체로 보관하는 데이터베이스 관리 시스템

  • 종단간 암호화

  • 안전성

  • 성능 개선 (p.267)

    • CDN

    • 병렬화 - 느슨하게 결합된 시스템 만들기 (e.g., 메시지 큐)

  • 오류 처리

  • 다국어 지원

  • 스트림 프로세싱

    • 아파치 하둡 맵리듀스(Apache Hadoop MapReduce)

    • 아파치 스파크 스트리밍(Apache Spark Streaming)

    • 아파치 스톰(Apache Storm)

    • 아파치 카프카(Apache Kafka)

  • 안정 해시

  • 블룸 필터

  • 메세지 큐

  • 오류 처리 (p.272)

    • 회복 가능 오류(recoverable error) - 몇 번 더 시도(retry)하면 해결된다. 복구 어려우면 오류 코드 반환

    • 회복 불가능 오류(non-recoverable error) - 중단 후 오류 코드 반환

  • 로드 밸런싱

    • 로드 밸런서(load balancer): API 서버 각각으로 고르게 요청을 분산하는 역할

    • 로드밸런서끼리 박동(heart) 신호를 주기적으로 보내서 상태를 모니터링 (p.297)

  • 트라이 (Trie) (p.229)

  • 데이터 샘플링 (p.239)

  • 롱테일 (p.271)

ID 생성 방식 (Ch.7 - 분산 시스템을 위한 유일 ID 생성기 설계)

  • base64 (요구사항에 따라 base62 등 다양)

  • UUID

  • 스노우플레이크 - 전역적 64-bit 순서 번호(sequence number) 생성기

  • 지역적 순서 번호 생성기 (local sequence number generator) - ID의 유일성은 같은 그룹(e.g., DB 파티션) 안에서만 보장

서비스 탐색 (Service Discovery)

  • 기준

    • 클라이언트의 위치(geographical location)

    • 서버의 용량(capacity)

  • 솔루션

    • 아파치 주키퍼(Apache Zookeeper) - 사용 가능한 서버를 등록시켜두면 클라이언트가 접속을 시도하면 사전에 정한 기준에 따라 최적의 서버를 골라준다.

개념

SPOF (Single Point of Failure)

  • 해당 서버가 죽으면 해당하는 전체 서비스가 중단, 최악의 경우 다른 서비스까지 중단

  • 해결법: 다중화

  • 서버 1대는 지양해야 함

채팅

  • 양방향 통신

    • 폴링(polling)

    • 롱 폴링(long polling)

      • Dropbox

    • 웹소켓(WebSocket)

  • 상태 유지 서비스 (웹소켓)

  • 접속 상태 관리

    • 접속 장애

      • 박동(heartbeat) 검사

        • 마지막 이벤트를 받은 지 x초 이내에 또 다른 박동 이벤트 메시지를 받으면 접속 상태를 온라인으로 유지, 그렇지 않으면 오프라인

        • e.g., 매 5초바다 박동 이벤트를 보내고, 30초 동안 아무런 메시지를 받지 않으면 오프라인으로 변경

비디오 스트리밍 (Ch.14)

  • 비디오 트랜스코딩 (p.253) - 비디오 인코딩이라고 부르기도 하는 절차로, 비디오의 포맷(MPEG, HLS 등)을 변환하는 절차. 단말이나 대역폭 요구사항에 맞는 최적의 비디오 스트림을 제공하기 위해 필요.

  • 스트리밍 프로토콜(streaming protocol) (p.256)

    • 비디오 스트리밍을 위해 데이터를 전송할 때 쓰이는 표준화된 통신 방법

    • 널리 쓰이는 방식

      • MPEG-DASH (Moving Picture Experts Group - Dynamic Adaptive Streaming over HTTP)

      • Apple HLS (HTTP Live Streaming)

      • Microsoft Smooth Streaming

      • Adobe HTTP Dynamic Streaming (HDS)

    • 프로토콜마다 지원하는 비디오 인코딩이 다르고 플레이어도 다르다. 따라서 서비스의 용례에 맞는 프로토콜을 선택해야 한다.

Previous가상 면접 사례로 배우는 대규모 시스템 설계 기초 (System Design Interview)NextReal Life Systems

Last updated 2 years ago

Was this helpful?