Новостная лента — один из самых сложных и критичных компонентов в продукте. Пользователь ожидает, что лента откроется мгновенно, покажет релевантный контент и не «сломается» даже при миллионах публикаций в сутки.
Что обычно должна уметь новостная лента
- показывать новые посты с минимальной задержкой
- поддерживать персонализацию и ранжирование
- масштабироваться на миллионы пользователей
- выдерживать пиковые нагрузки
- быстро отдавать первую страницу и пагинацию
- обеспечивать отказоустойчивость
Базовые требования
- Функциональные: публикация постов, подписки, лайки, комментарии, скрытие контента, бесконечная прокрутка
- Нефункциональные: низкая задержка, высокая доступность, горизонтальное масштабирование, eventual consistency
Два основных подхода
-
Pull model (fan-out on read)
Посты сохраняются, а лента собирается при запросе пользователя.
- Плюсы: проще обновлять, меньше лишних записей.
- Минусы: высокая нагрузка на чтение, сложнее быстро собирать ленту.
-
Push model (fan-out on write)
При публикации пост заранее раскладывается в ленты подписчиков.
- Плюсы: быстрый рендер ленты.
- Минусы: дорогая запись, особенно у пользователей с миллионами подписчиков.
На практике почти всегда используют гибрид: обычных авторов пушат, а «селебрити» обрабатывают через pull. 🚀
Типовая архитектура
- API Gateway — принимает запросы клиента
- Auth Service — проверяет доступ
- Post Service — управляет публикациями
- Social Graph Service — хранит подписки
- Feed Generator — формирует ленту
- Ranking Service — сортирует по релевантности
- Cache (Redis) — ускоряет чтение
- Message Broker (Kafka/RabbitMQ) — асинхронная доставка событий
- DB:
- PostgreSQL/MySQL для метаданных
- Cassandra/DynamoDB для масштабируемых feed storage
- Object Storage для медиа
Как работает публикация поста
- автор создает пост
- событие уходит в брокер
- feed generator определяет подписчиков
- для части пользователей пост записывается в precomputed feed
- ranking service обновляет приоритет
- кэш прогревается для активных пользователей
Как работает чтение ленты
- клиент запрашивает первую страницу
- система читает готовую ленту из кэша или feed storage
- ranking service применяет сигналы: свежесть, интересы, вовлеченность
- возвращаются N постов и cursor для следующей страницы
Ключевые сложности
- Горячие ключи — аккаунты с огромной аудиторией
- Дедупликация — один и тот же пост не должен повторяться
- Пагинация — лучше cursor-based, а не offset
- Консистентность — лайки и комментарии могут обновляться отдельно
- Фильтрация — блокировки, privacy, модерация, скрытые посты
- Cold start — что показывать новому пользователю 🤖
Что часто спрашивают на собеседовании
- почему выбран push/pull/гибрид
- где хранить готовые ленты
- как решать проблему знаменитостей
- как кэшировать первую страницу
- как обеспечить порядок и релевантность
- как масштабировать систему без деградации
Вывод
Хороший дизайн новостной ленты — это компромисс между скоростью чтения, стоимостью записи и качеством ранжирования. Для MVP хватит простого pull-подхода, но для большого продукта почти неизбежен гибрид с кэшем, очередями и отдельным ranking service. 🧠
Присмотритесь к подборке каналов про IT — там много полезного про system design, архитектуру и реальные инженерные кейсы.