System Design
Case Study: Twitter/X
Когда Илон Маск пишет твит, он создаёт 150 миллионов записей в базе. Без trick'а с celebrity cutoff Twitter упал бы на каждом таком твите.
- Twitter/X: 500M твитов/день, 200M DAU, 6M QPS на чтение timeline в пике.
- Cristiano Ronaldo - 600M followers; один пост создаёт fan-out, превышающий весь дневной write-traffic малой соцсети.
- Twitter 2010-2012: классические FailWhale-аутажи именно из-за наивного fan-out на celebrity-аккаунтах.
- Manhattan (Twitter NoSQL, 2014): write throughput - 10M ops/sec, latency P99 < 10ms; построен поверх множества MySQL-шардов.
Цели урока
- Понять fan-out problem и его решения
- Спроектировать hybrid fan-out (push + pull)
- Использовать Redis Sorted Sets для pre-computed timelines
- Выбрать правильные базы данных для разных access patterns
- Масштабировать систему до сотен миллионов пользователей
Предварительные знания
- Message Queue для async processing
- Понимание кеширования и Redis
- Базовые знания о NoSQL (Cassandra)
Требования и масштаб
**Задача**: спроектировать социальную сеть типа Twitter. Пользователи постят твиты, подписываются друг на друга, читают ленту.
**Главный challenge**: 6M QPS на чтение timeline. Каждый timeline = твиты от сотен подписок. Наивный подход не сработает.
200M DAU, каждый смотрит ленту 30 раз в день. Сколько примерно QPS на чтение timeline?
Fan-out Problem
Когда @elonmusk (150M followers) постит твит, как доставить его в 150 миллионов лент? Это **fan-out problem**.
Ни один подход не идеален. Twitter использует **гибридный** подход, комбинируя оба.
Пользователь подписан на 1000 аккаунтов. При Fan-out on Read сколько примерно DB запросов нужно для построения timeline?
Гибридный подход Twitter
Twitter использует **гибридный fan-out**: Push для обычных пользователей, Pull для celebrities (>10K followers).
**Почему 10K?** Это баланс: 99% пользователей имеют <10K followers. Celebrity pull добавляет ~10ms latency, что приемлемо.
При hybrid подходе, что происходит когда @taylorswift (100M followers) постит твит?
Хранение Timeline в Redis
Pre-computed timelines хранятся в **Redis Sorted Sets**. Score = timestamp, value = tweet_id.
**Только tweet_id!** Timeline хранит ID, не полные твиты. Гидратация (fetch full tweet) происходит при чтении.
Почему в Redis Sorted Set хранятся tweet_id, а не полные твиты?
Data Model и Storage
Twitter использует разные базы данных для разных access patterns: SQL для твитов, Cassandra для follow graph, Redis для timelines.
**Денормализация**: followers и following - две таблицы для одних данных. Разные access patterns = разные оптимизации.
Twitter держит весь follow graph в одном Neo4j или подобной графовой БД - для социальной сети нужна именно graph database.
Twitter использует Cassandra с денормализованными таблицами followers и following. Graph databases плохо шардятся за пределы одного узла; Cassandra даёт линейное масштабирование на write при сотнях миллионов пользователей.
Реальные access patterns - 'мои followers' и 'на кого я подписан' - сводятся к запросу одной partition по user_id. Graph traversals (2-hop, 3-hop) на масштабе Twitter не делаются on-line: для них существуют отдельные batch-pipeline (Pig/Spark) и embedding-сервисы.
Почему follow graph хранится в Cassandra, а не MySQL?
Ключевые решения Twitter Design
- **Hybrid Fan-out**: Push для <10K followers, Pull для celebrities
- **Pre-computed Timelines**: Redis Sorted Sets (tweet_id only)
- **Polyglot Persistence**: MySQL (tweets), Cassandra (graph), Redis (timelines)
- **Sharding**: by user_id для всех stores
- **Async Processing**: Kafka для fan-out, notifications, analytics
- **Celebrity Optimization**: Pull on read добавляет ~10ms, но избегает 100M writes
Связанные темы
Twitter design использует многие паттерны
- Message Queue — Kafka для async fan-out
- Case Study: YouTube — Следующий case study - video streaming
- Caching — Redis для timeline storage
Вопросы для размышления
- Если порог celebrity = 10K followers, что происходит с follower count = 9999 → 10001 в момент перехода? Какой механизм должен обрабатывать миграцию?
- Каков худший случай latency timeline read при hybrid fan-out, и какие компоненты системы определяют этот worst case?
- Twitter добавил алгоритмический timeline (For You) поверх chronological. Как это меняет fan-out и storage стратегию?
Связанные уроки
- sd-13-url-shortener — Базовые паттерны масштабирования перед сложной соцсетью
- sd-09-message-queue — Fan-out через message queue для доставки твитов в ленты
- sd-07-caching — Celebrity timelines кэшируются отдельно из-за fan-out проблемы
- db-17-nosql-overview — NoSQL для timelines: строки = пользователи, колонки = твиты
- dist-14-sharding