팬아웃은 push로 미리 꽂고 pull로 즉석에서 합치는데, 유명인만 pull로 빼는 하이브리드가 답이다
·수정 1회
요약
- 피드/타임라인을 만들 때 "팔로우한 사람들의 글을 언제 모아주느냐"가 팬아웃 문제다.
- push(쓰기 시점)와 pull(읽기 시점)은 비용이 터지는 지점이 정반대라, 둘을 섞은 하이브리드가 실제 해법이다.
본문
두 방식과 정반대로 터지는 비용
push (쓰기 시점 fan-out, fan-out on write)
- A가 글을 올리면 → 그 즉시 A의 팔로워 전원 피드함에 글을 복사해 꽂아둠
- 읽을 때는 자기 피드함만 보면 됨 → 읽기 빠름
- 문제: 팔로워 많은 유저(유명인) 가 글 하나 올리면 팔로워 수만큼 쓰기가 일어남 → 쓰기 폭증(write amplification)
pull (읽기 시점 fan-out, fan-out on read)
- 글을 올릴 때 아무 데도 안 꽂음
- 읽을 때 내가 팔로잉한 사람들 글을 일일이 확인해서 모아 합침 → 쓰기 가벼움
- 문제: 팔로잉을 많이 한 유저 가 피드를 열 때마다 수많은 사람을 조회+머지 → 읽기 폭증
핵심은 두 문제의 축이 정반대라는 것:
- push가 터지는 건 팔로워(out-degree)가 많은 쪽 — 쓸 때
- pull이 터지는 건 팔로잉(in-degree)이 많은 쪽 — 읽을 때
하이브리드 — 계정을 둘로 나눈다
기준은 팔로워 수. 임계값을 넘는 계정(유명인)만 다르게 처리한다.
- 일반 유저 → push. 글 쓰면 팔로워 피드함에 미리 꽂아둠
- 유명인 → push 안 함. 읽는 시점에 pull
유저가 피드를 열었을 때 최종 화면은:
최종 피드 = (미리 꽂혀 있던 일반 유저 글들)
+ (내가 팔로잉한 유명인의 새 글을 읽는 시점에 pull)
→ 둘을 시간순으로 정렬해서 보여줌
이러면 유명인 글 때문에 팔로워 수만큼 쓰는 폭증을 피하고(유명인은 pull), 일반 유저 글은 미리 꽂혀 있어 읽기가 여전히 빠르다(일반인은 push). 즉 양쪽이 터지는 지점을 각각 피해 간다.
위치
- Twitter(현 X)가 쓰는 방식으로 알려진 대표적 하이브리드 팬아웃 설계다.
- 임계값을 팔로워 수만으로 자르는 게 가장 단순한 형태고, 활동성·접속 여부 등을 더 섞기도 한다. (← 추가 학습 포인트)
참고
- CQRS (Command and Query Responsibility Segregation)는 읽기 연산과 쓰기 연산을 분리해 부하를 최적화한다. — 읽기·쓰기 경로를 나눠 부하를 최적화한다는 같은 발상
- 5가지 캐시 전략 - aside, read-through, write around, write through, writeback — push는 write-through(미리 계산해 둠), pull은 읽기 시점 계산. precompute vs on-read 구조가 같음