Почему мы перестали собирать персональную ленту SQL-запросами

ney 26 минут назад Почему мы перестали собирать персональную ленту SQL-запросами Средний 6 мин 453 Микросервисы * Go * MongoDB * Высоконагруженные системы * Кейс Представьте пользователя, который подписан на несколько...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Значимый прорыв формирует отрасль ИИ: ney 26 минут назад Почему мы перестали собирать персональную ленту SQL-запросами Средний 6 мин 453 Микросервисы * Go * MongoDB * Высоконагруженные системы * Кейс Представьте пользователя, который подписан на несколько сотен тегов. Каждый раз, когда он открывает приложение, персональная лента должна собраться за десятки миллисекунд. На первый взгляд задача решается обычным SQL-запросом с несколькими JOIN.
Мы тоже начали именно с этого подхода. Но когда количество пользователей, подписок и публикаций выросло до миллионов, даже хорошо оптимизированные запросы перестали укладываться в требования по скорости. Тогда мы отказались от сборки ленты «на лету» и начали хранить её в готовом виде.
Технические детали
Меня зовут Антон Анисимов, я backend-разработчик в Спортсе”. Мы делаем спортивное медиа с новостями, редакционным и пользовательским контентом. В разработке в основном используем микросервисы на Go.
В этой статье расскажу, почему мы отказались от SQL для формирования персональной ленты, как организовали её хранение в MongoDB и какие компромиссы пришлось принять. Для пользователей мы предлагаем разные варианты лент контента:редакционная лента – составляется вручную редакторами сайта, никакой дополнительной механики, показываем ровно то, что выбрал редактор;рекомендательная лента – составляется ML-сервисом, который анализирует историю просмотров, лайки/дизлайки, понравившиеся темы. Со стороны бэкенда логика простая – отображаем то, что выдал ML-сервис;персональная лента – составляется на основе подписок пользователя.
Формируется бэкендом с учётом подписок пользователя. Именно о персональной ленте дальше и пойдёт речь. Выглядит она примерно так:Механика:пользователь подписывается на теги — метки для объединения контента по определённой теме: команде, турниру или игроку;редакторы публикуют новости и статьи, указывают теги;пользователь открывает свою ленту и видит контент по интересующим его тегам;пользователь видит контент в хронологическом порядке.
Отраслевые последствия
На первый взгляд задача выглядит простой. Но есть одна проблема: пользователь может быть подписан на сотни тегов, а на популярные теги подписаны тысячи пользователей. С похожей проблемой сталкиваются разработчики многих популярных соцсетей, и каждый решает её по-своему.
На Хабре это очень похоже на раздел «Моя лента». Данные у нас хранятся в реляционной базе. Основные таблицы:тегипользователиновостиИ таблицы связей:подписки пользователей на тегитеги новостей На самом деле, пользователь также может подписываться на теги, блоги и авторов.
В ленте могут быть как новости, так и статьи. Для простоты пока рассмотрим только новости по тегам. В простом случае задачу можно решить SQL-запросом с JOIN.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





