팔로우한 작성자·그룹·추천 source를 분리해 후보를 만들고 post ID로 합칩니다.
뉴스 피드 시스템
설계
모든 게시물을 미리 복사하면 hot 작성자가 쓰기 폭주를 만들고, 전부 읽을 때 합치면 평범한 사용자도 큰 비용을 냅니다. 사용자별 fan-out 전략과 전환 경계를 따로 정합니다.
hot 작성자는 팔로워 수 하나가 아니라 예상 inbox 쓰기량과 queue age로 판단합니다. 전환·롤백 임계값을 다르게 두고 source watermark와 post ID로 이행 구간의 중복과 누락을 확인합니다.
빠른 목록보다 안전한 노출 경계를 먼저 정한다
홈 피드는 작성·팔로우·차단·삭제처럼 서로 다른 정본을 만납니다. inbox의 빠른 후보와 실제 열람 권한을 같은 것으로 취급하지 않습니다.
불투명 cursor와 정렬 snapshot으로 새 post가 들어와도 스크롤 중복을 줄입니다.
삭제·차단·언팔로우·공개 범위 변경은 다음 응답에서 숨길 수 있어야 합니다.
ranker나 feature가 실패해도 정책 필터를 거친 시간순 후보를 제한적으로 보입니다.
post 정본, graph, 후보 inbox, ranker를 분리한다
post 저장과 outbox 기록은 같은 쓰기 경계에서 확정하고, fan-out·색인·랭킹 feature는 재시도 가능한 소비자로 분리합니다. 읽기에서는 hot timeline과 inbox 후보를 합친 뒤 정책을 먼저 확인합니다.
post_id 중복 제거가 필요합니다.hot 작성자를 어떤 수치로 전환하고 언제 되돌릴 것인가?
쓰기량·queue age 기반 hybrid fan-out + hysteresis
예상 inbox 쓰기가 2,000/s를 5분 넘거나 queue age가 15초를 넘으면 read fan-out으로 전환합니다. 800/s 미만 30분과 backlog 0을 확인한 뒤에만 원복합니다.
선택 이유
- 팔로워 수 하나보다 게시 빈도와 실제 queue 지연을 함께 반영합니다.
- 전환·롤백 임계값을 달리해 경계에서 정책이 반복 진동하는 일을 막습니다.
- source watermark와 post ID 중복 제거로 이행 중 누락·중복을 제한합니다.
팔로워 수 임계값 하나로 즉시 양방향 전환
게시 빈도와 큐 상태를 놓치고 경계 근처 작성자가 write/read fan-out을 반복해 캐시·backlog를 흔듭니다.
감수한 단점
- 읽기 경로가 inbox와 author timeline을 함께 병합해야 합니다.
- 전환 중 두 source에 같은 post가 존재할 수 있습니다.
- 임계값은 follower 분포·게시 빈도·인프라 비용을 실측해 조정해야 합니다.
쓰기에는 후보를, 읽기에는 정책과 순위를 둔다
작성 ACK 전에 post 정본과 전파 이벤트가 함께 기록되어 유실 창을 줄입니다.
follower 배치에 post ID를 멱등 upsert해 개인 inbox 후보를 만듭니다.
수백만 inbox write 대신 author timeline 하나를 기록해 읽을 때만 합칩니다.
block, mute, audience, 삭제, tombstone을 ranker 앞에서 제거합니다.
신선도·관계 feature로 정렬하고 세션 안정성을 위한 snapshot cursor를 돌려줍니다.
평균이 아니라 긴 꼬리와 철회 비용을 비교한다
hybrid fan-out은 두 경로를 운영하는 비용을 감수합니다. 대신 유명 작성자의 쓰기 폭주와 일반 사용자의 read fan-in을 분리하고, 삭제·차단 정책은 최종 노출 전에 다시 확인합니다.
| 선택 | 강점 | 제약 | 적용 판단 |
|---|---|---|---|
| fan-out on write | 개인 inbox 읽기가 빠르고 단순 | 팔로워 수만큼 queue·저장 write가 증가 | 일반 작성자, 높은 읽기 빈도 |
| fan-out on read | post는 한 번 기록, write 폭발 방지 | feed 열기 때 timeline 병합·hydrate 비용 | 매우 큰 follower를 가진 hot 작성자 |
| hybrid | 긴 꼬리 비용을 제한 | 경계, 이행, dedupe, 관측이 복잡 | 팔로워 분포가 크게 치우친 서비스 |
| 시간순 fallback | 설명·복구·디버깅이 쉬움 | 관련성·다양성 최적화가 제한 | ranker 장애, 초기 제품 |
| inbox에 post ID | 삭제·수정·privacy를 정본에서 확인 | read-time hydrate 필요 | 철회 요구가 중요한 피드 |
지연·중복·철회를 측정 가능한 복구 절차로 만든다
새 post가 follower inbox에 늦어져 작성 시각과 노출 시각이 크게 벌어집니다.
한 post가 수백만 inbox write를 만들어 일반 작성자까지 밀어냅니다.
at-least-once 재시도나 이행 구간에서 같은 카드가 두 번 보일 수 있습니다.
(viewer, post) 멱등 upsert, read dedupe, source watermark. duplicate 0을 표본 검사합니다.feature 지연·모델 오류가 빈 피드나 높은 p99로 이어집니다.
stale inbox와 cache에 삭제·차단된 post가 잠시 남습니다.
팔로우·block 정책을 읽지 못해 노출 판단이 불명확해집니다.
보안·관측·비용을 후보 생성 밖에서 운영한다
cursor를 viewer·정책 버전에 결속하고, 권한 필터를 ranker보다 먼저 둡니다. 관계 그래프·본문·feature는 최소 권한과 보존 기간으로 접근합니다.
fan-out lag, candidate shortage, hot merge, ranker fallback, duplicate, revoke-to-hide를 author·source·policy 차원으로 제한해 관측합니다.
inbox write·복제·TTL, timeline merge, post hydrate, feature read, purge와 고카디널리티 로그가 비용을 만듭니다. hit ratio 하락은 origin read를 급증시킵니다.
답변 구조 보기 6단계
- 홈 피드 범위, 시간순/랭킹, 최대 팔로워 수, 삭제·차단 SLA, 광고·추천 포함 여부를 먼저 확인한다.
- post·graph·feed inbox를 정본과 파생 데이터로 구분하고, post 저장과 outbox 기록을 원자화한다.
- 일반 작성자에는 fan-out on write, hot 작성자에는 fan-out on read를 쓰는 hybrid 정책과 그 경계의 관측 지표를 설명한다.
- 읽기에서 inbox·timeline 후보를 합치고 권한·삭제 필터를 ranker보다 먼저 적용한다고 말한다.
- 큐 적체, hot user, 중복, ranker 장애, 삭제/privacy 철회 지연, graph 실패를 감지·대응·복구 검증까지 연결한다.
- 마지막으로
revoke_to_hide_seconds, fan-out lag, candidate shortage, fallback ratio, 비용과 feature privacy를 운영 지표로 제시한다. 이번 선택: hot 전환과 롤백에 서로 다른 임계값과 유지 시간을 둔다. 깨지는 신호: 정책이 경계에서 반복 전환되거나 두 source 병합에서 duplicate·gap이 늘어난다. 다음 검증: 9,000 writes/s 버스트 뒤 backlog drain과 800/s 롤백을 순서대로 재현한다.
18만 팔로워·분당 3개 게시물을 read fan-out으로 전환하기
예상 쓰기량과 queue age로 전환·롤백을 계산합니다.
- 18만×3÷60으로 약 9,000 writes/s를 계산합니다.
- 2,000/s·15초 조건에서 hot 정책을 전환합니다.
- 800/s 30분·backlog 0에서만 원복합니다.
두 source 병합과 경계 진동을 부하 시험합니다.
- post ID dedupe와 watermark gap을 관측합니다.
- 일반 작성자의 post-to-inbox 지연 회복을 확인합니다.
- 버스트 뒤 backlog drain과 hysteresis를 재현합니다.
기술 규격·공식 문서
- USENIX ATC 2013 — TAO: Facebook’s Distributed Data Store for the Social Graph: 대규모 소셜 그래프 저장·캐시의 1차 연구.
- Meta Engineering — TAO: The power of the graph: TAO의 그래프 계층 개요.
- Apache Kafka — Design: 파티션 순서와 consumer group의 공식 설계 문서.
- 이 페이지의 fan-out 경계, 규모, TTL, 신선도·랭킹 식, 삭제 SLA는 제품 사실이 아닌 학습용 설계 가정입니다.
새 콘텐츠의 알림·피드 전파를 비교합니다.
문의·정정
사실 오류·출처 정정은 문의·정정 페이지로 알려 주세요.