Phase 8레슨 36
Instagram 아키텍처
Post, Feed, Timeline Fan-out, CDN — 수억 사용자의 사진을 어떻게
💡ELI5·
우편함과 피드
Fan-out on Write (쓰기 시 복사): 친구A 게시 → [나의 피드][친구B 피드][친구C 피드]에 미리 넣음 → 내가 피드 열면 이미 준비됨 (빠름) → but 친구A가 1만 팔로워면 1만 번 복사 (느림) Fan-out on Read (읽기 시 조합): 친구A 게시 → 저장만 → 내가 피드 열 때 팔로우하는 사람들 최신 게시물을 실시간 조합 → 빠른 쓰기 but 느린 읽기
💡 비유 — 우편함. Fan-out on Write = 우체부가 각자 우편함에 미리 넣어둠 (열면 바로 있음). Fan-out on Read = 우체국에 쌓아두고, 열 때마다 가져옴 (열 때 시간 걸림).
🔬Deep Dive·
Instagram 아키텍처 진화
초기 (2010): Django + PostgreSQL (단일) → 사용자 증가 중기: + Redis (피드 타임라인) + Cassandra (사진 메타데이터) + S3 + CDN (사진 저장) + Sharding (사용자 DB) 현재: + 알고리즘 피드 (랭킹 서비스) + GraphQL API + 멀티 리전 복제 + ML 기반 추천
Instagram은 '처음부터 완벽한 분산 시스템'이 아니라, 단일 PostgreSQL에서 시작하여 필요에 따라 점진적으로 분리. 이것이 Evolutionary Architecture의 교과서적 사례.
🔬Deep Dive·
하이브리드 Fan-out
| 사용자 유형 | 팔로워 수 | 방식 | 이유 |
|---|---|---|---|
| 일반 사용자 | < 1천 | Fan-out on Write | 쓰기 비용 낮음, 읽기 빠름 |
| 인플루언서 | 수백만~수천만 | Fan-out on Read | 쓰기 폭발 방지 |
| 중간 규모 | 수천~수만 | 선택적 Fan-out | 비용과 지연의 균형 |
⚖️Trade-off·
피드 설계의 Trade-off
| Fan-out on Write | Fan-out on Read |
|---|---|
| 읽기 매우 빠름 (미리 준비) | 쓰기 매우 빠름 (저장만) |
| 유명인 쓰기 폭발 | 피드 읽기 지연 |
| 저장 비용 (피드 복사본) | 읽기마다 조합 연산 |
| 삭제 시 여러 피드 정리 필요 | 실시간 조합이 복잡 |
❓ 체크포인트 질문
- 1.Fan-out on Write와 Fan-out on Read의 차이는?
- 2.Instagram이 사진 저장에 CDN을 사용하는 이유는?
- 3.인플루언서(수천만 팔로워)의 게시물이 Fan-out on Write의 문제인 이유는?
- 4.Instagram이 초기에 단일 PostgreSQL로 시작할 수 있었던 이유는?
- 5.피드의 '최신순' 정렬이 단순 timestamp로 안 되는 이유는?