Проектирование новостной ленты: System Design

Мы просто и по делу рассказываем про ИИ-инструменты для работы: сравнения, пошаговые гайды, бесплатные альтернативы и реальные сценарии применения. Помогаем выбрать между ChatGPT, Gemini, Claude, локальными моделями и десятками узкоспециализированных сервисов — от дизайна и HR до аналитики и SEO. Меньше хайпа, больше практики и экономии времени каждый день.

новостная лентаsystem designранжирование

Новостная лента — один из самых сложных и критичных компонентов в продукте. Пользователь ожидает, что лента откроется мгновенно, покажет релевантный контент и не «сломается» даже при миллионах публикаций в сутки.

Что обычно должна уметь новостная лента

  • показывать новые посты с минимальной задержкой
  • поддерживать персонализацию и ранжирование
  • масштабироваться на миллионы пользователей
  • выдерживать пиковые нагрузки
  • быстро отдавать первую страницу и пагинацию
  • обеспечивать отказоустойчивость

Базовые требования

  • Функциональные: публикация постов, подписки, лайки, комментарии, скрытие контента, бесконечная прокрутка
  • Нефункциональные: низкая задержка, высокая доступность, горизонтальное масштабирование, eventual consistency

Два основных подхода

  1. Pull model (fan-out on read)

    Посты сохраняются, а лента собирается при запросе пользователя.

    • Плюсы: проще обновлять, меньше лишних записей.
    • Минусы: высокая нагрузка на чтение, сложнее быстро собирать ленту.
  2. 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, архитектуру и реальные инженерные кейсы.

🗣 Подборки каналов
🧠 Каталог ботов и приложений
🗺 Навигация

Читайте так же