대규모 팬아웃: 푸시 vs 풀 전략 in Distributed Systems
Source: Dev.to
현대 시스템은 데이터를 저장하지 못해서 실패하는 것이 아니라, 올바른 데이터를 올바른 소비자에게 적시에 전달하지 못해서 실패합니다.
팬아웃 문제는 분산 시스템에서 가장 근본적인 도전 과제 중 하나이며, 특히 소셜 미디어 피드, 알림 시스템, 메신저 플랫폼, 이벤트‑드리븐 아키텍처에서 두드러집니다.
단일 이벤트가 발생했을 때, 이를 수백만 명의 소비자에게 효율적으로 전달하려면 어떻게 해야 할까요? 주요 전략 두 가지는 다음과 같습니다:
- Fanout‑on‑Write (Push)
- Fanout‑on‑Read (Pull)
두 방법 모두 유효하고 널리 사용되지만, 각각 심각한 트레이드‑오프를 동반합니다.
팬아웃 문제
- 하나의 쓰기 → 다수의 읽기
- 목표: 사용자가 수백만 명의 팔로워를 가지고 있더라도 모든 팔로워에게 저지연, 개인화된 피드를 제공하는 것.
나이브한 해결책—“그냥 모든 사람에게 게시물을 보내라”—는 다음 문제들 때문에 무너진다:
- 쓰기 증폭
- 저장소 폭발
- 핫 파티션
- 지연 시간 급증
Fanout‑on‑Write (푸시)
사용자가 콘텐츠를 생성하면 시스템이 즉시 푸시하여 각 팔로워의 사전 계산된 피드에 콘텐츠를 전달합니다.
작동 방식
User posts → System pushes post to N follower feeds
장점
- 초고속 피드 읽기
- 예측 가능한 읽기 지연시간
- 간단한 읽기 쿼리 (단일 조회)
비용 / 트레이드오프
- 대규모 쓰기 증폭 (예: 팔로워가 1억 명인 유명인이 한 게시물을 올리면 1억 개의 피드 쓰기가 발생)
- 높은 저장소 사용량
- 활발한 사용자가 시스템에 과부하를 일으킬 수 있음
Fanout‑on‑Read (Pull)
사용자가 피드를 열면, 시스템은 pull 방식으로 사용자가 팔로우하는 계정들의 최신 게시물을 가져와서 병합하고, 순위를 매기며, 읽는 시점에 필터링합니다.
작동 방식
User opens feed → System pulls content from many sources
장점
- 쓰기 비용 최소화 (팔로워당 쓰기 없음)
- 극단적인 팬아웃을 가진 사용자(셀러브리티)에게도 잘 확장됩니다
- 스토리지 효율적
비용 / 트레이드오프
- 읽기가 더 복잡하고 비용이 많이 듭니다
- 푸시 방식에 비해 읽기 지연 시간이 더 깁니다
- 효율적인 캐시가 어려워집니다
하이브리드 팬아웃 전략
Pure push or pure pull is rare at large scale; most platforms use a hybrid approach.
대규모에서는 순수 푸시나 순수 풀 방식이 드물며, 대부분의 플랫폼이 하이브리드 방식을 사용합니다.
선택적 팬아웃
- Push for normal users (bounded fanout)
- 일반 사용자에 대해 푸시 (제한된 팬아웃)
- Pull for celebrities or high‑fanout content
- 유명인이나 고팬아웃 콘텐츠에 대해 풀
하이브리드가 효과적인 이유
- Top ~0.01 % of users generate extreme fanout; pushing their posts would melt storage and queues.
- 상위 ~0.01 % 사용자가 극단적인 팬아웃을 생성합니다; 이들의 게시물을 푸시하면 저장소와 큐가 과부하됩니다.
- Precomputation, ranking models, and feed materialization are applied where they provide the most benefit.
- 사전 계산, 랭킹 모델, 피드 물리화가 가장 효과적인 곳에 적용됩니다.
일반적인 구성
- Precomputed feed entries (push)
- 사전 계산된 피드 항목 (푸시)
- Dynamically fetched content (pull) – e.g., suggested posts, ads, reels
- 동적으로 가져오는 콘텐츠 (풀) – 예: 추천 게시물, 광고, 릴
도메인별 하이브리드
- Professional graphs (smaller, denser) → primarily push
- 전문가 그래프 (작고 밀집) → 주로 푸시
- Interest‑based feeds (large, sparse) → primarily pull, using recommendation pools and ML‑ranked candidate sets
- 관심 기반 피드 (크고 희소) → 주로 풀, 추천 풀 및 머신러닝 순위 후보 세트를 사용
소셜 피드 이상의 팬아웃
| 전략 | 전형적인 사용 사례 | 핵심 특성 |
|---|---|---|
| 푸시 팬아웃 | 모바일 푸시 알림, 비상 경보, 거래 알림, 캐시 무효화, 보안 패치 | 메시지 큐 또는 토픽 기반 퍼브/섭 사용, 속도 제한 필요, 저지연 전달 제공 |
| 풀 팬아웃 | 카프카 소비자, 프로메테우스 스크래핑, 드물게 접근되는 자산의 지연 페치 | 소비자가 파티션에서 풀링, 백프레셔, 재생 가능성 및 장애 격리 제공 |
| 하이브리드 | 가격 틱(푸시) + 히스토리 데이터(풀), 킬스위치 업데이트(푸시) + 주기적 일관성 검사(풀) | 대역폭, 지연시간 및 저장 제약을 균형 있게 조정 |
올바른 Fanout 전략 선택 방법
Fanout‑on‑Write (Push)를 사용할 때:
- 읽기 지연 시간이 최소이어야 함
- Fanout 규모가 제한적일 때 (예: 대부분의 사용자)
- 저장소가 저렴하고 풍부함
- 예측 가능한 성능이 중요함
Fanout‑on‑Read (Pull)를 사용할 때:
- Fanout 규모가 무제한일 때 (예: 유명인)
- 쓰기 비용이 저렴해야 함
- 소비자 수요가 크게 변동함
- 하위 서비스 보호를 위해 백프레셔가 필요함
하이브리드 접근법을 사용할 때:
- 대부분의 사용자에게 저지연 읽기와 극한 Fanout에 대한 확장 가능한 처리가 모두 필요할 때
- 일부 콘텐츠는 미리 계산하고 나머지는 동적으로 가져올 수 있을 때
Fanout를 물류에 비유하면:
- Push = 집으로 배달 – 빠르고 예측 가능하지만 비용이 더 많이 듭니다.
- Pull = 창고 픽업 – 저렴하고 유연하지만 느립니다.
- Hybrid = Amazon Prime – 고우선순위 항목에 대한 빠른 배송과 나머지에 대한 비용 효율적인 처리를 결합합니다.