Разработка системы новостных лент в социальных сетях
4 февраля 2023 г.Ключевые слова новостная лента и хронология взаимозаменяемы. Вот некоторые из сервисов, похожих на новостные ленты социальных сетей:
* Лента новостей Facebook * Хронология Твиттера * Лента в инстаграме * Канал подкастов Google * Хронология новостей Google * Лента на Этси * Подача * Лента Реддит * Средняя подача * Лента Quora
Требования
- Лента новостей пользователя должна создаваться почти в режиме реального времени на основе активности в ленте людей, на которых подписан пользователь.
- Элементы канала содержат текстовые и мультимедийные файлы (изображения, видео)
Хранение данных
Схема базы данных
* Основными объектами базы данных являются таблица Users, таблица FeedItems и таблица Follows. * Связь между таблицами Users и FeedItems — 1-ко-многим. * Связь между таблицами Users и Follows — многие ко многим. * Follows – это сводная таблица, представляющая отношения (отслеживание-подписчик) между пользователями
Тип хранилища данных
- Медиафайлы (изображения, видео) хранятся в управляемом хранилище объектов, таком как AWS S3
- В базе данных SQL, такой как Postgres, хранятся метаданные пользователя (подписчики, личные данные)
- Хранилище данных NoSQL, такое как Cassandra, хранит временную шкалу пользователя.
- Кэш-сервер, такой как Redis, хранит предварительно созданную временную шкалу пользователя.
Дизайн высокого уровня
* Сервер хранит элементы фида на кеш-серверах и в хранилище NoSQL. * Сгенерированная новостная лента хранится на кэш-сервере * Публикация ленты для неактивных пользователей не осуществляется, но используется модель вытягивания (разветвление при загрузке). * Публикация фида для активных пользователей, не являющихся знаменитостями, основана на модели push (разветвление при записи). * Публикация ленты для знаменитостей основана на гибридной двухтактной модели. * Клиент получает новостную ленту с серверов кеша
Написать путь
- Клиент создает HTTP-соединение с балансировщиком нагрузки, чтобы создать элемент фида.
- Балансировщик нагрузки делегирует клиентское подключение веб-серверу со свободной емкостью.
- Запросы на запись для создания элементов фида ограничены.
- Элемент фида сохраняется в очереди сообщений для асинхронной обработки, и клиент получает немедленный ответ
- Служба разветвления распределяет элемент канала по нескольким службам для создания канала новостей для подписчиков клиента.
- В хранилище объектов сохраняются файлы видео или изображений, встроенные в элемент фида.
- Магазин NoSQL сохраняет временную шкалу пользователей (элементы фида в обратном хронологическом порядке).
- В базе данных SQL хранятся метаданные пользователей (взаимоотношения пользователей) и элементы канала.
- На кэш-сервере хранится ограниченное количество элементов ленты для пользователей с определенным порогом подписчиков.
- Идентификаторы элементов ленты хранятся на сервере кэша пользовательской временной шкалы для дедупликации.
- Служба создания каналов подписывается на службу разветвления для получения любых обновлений.
- Служба создания канала запрашивает хранящуюся в памяти службу информации о пользователе, чтобы определить подписчиков пользователя и категорию пользователя (активные пользователи, не являющиеся знаменитостями, неактивные, знаменитые пользователи).
- Служба создания фидов создает домашнюю хронику для активных пользователей, не являющихся знаменитостями, используя модель push-уведомлений (разветвление при записи) за линейное время O(n), где n – количество подписчиков.
- Элементы канала ранжируются, сортируются и объединяются для создания домашней временной шкалы для пользователя.
- Временная шкала для активных пользователей хранится на кэш-сервере для быстрого поиска.
- Фид для неактивных пользователей не публикуется, но используется модель вытягивания (разветвление при загрузке).
- Публикация фидов для знаменитостей основана на гибридной модели push-pull (объединение элементов фида знаменитостей с домашней хроникой пользователя по запросу)
- В качестве альтернативы при публикации ленты для знаменитостей можно использовать модель push-уведомлений только для онлайн-подписчиков в пакетном режиме (неоптимальное решение).
Читать путь
- Клиент выполняет DNS-запрос для разрешения имени домена.
- Клиент запрашивает CDN, чтобы проверить, кэшируются ли элементы канала для домашней временной шкалы в CDN.
- Клиент создает HTTP-соединение с балансировщиком нагрузки.
- Балансировщик нагрузки делегирует клиентское подключение веб-серверу со свободной емкостью.
- Запросы на чтение для получения ленты новостей ограничены по скорости
- Веб-сервер запрашивает у службы временной шкалы новостную ленту.
- Служба временной шкалы запрашивает службу информации о пользователе, чтобы получить список подписчиков и определить категорию пользователя (активный, неактивный, подписанный на знаменитостей)
- Кэш домашней временной шкалы запрашивается для получения списка идентификаторов элементов фида.
- Элементы канала извлекаются из кэш-сервера элементов канала путем выполнения операции MGET в Redis.
- Когда клиент выполняет запрос на получение временной шкалы другого пользователя, служба временной шкалы запрашивает сервер кэширования временной шкалы пользователя.
- Последователь базы данных SQL (реплика) запрашивается при промахе кэша
- Медиафайлы, встроенные в элементы ленты, извлекаются из хранилища объектов.
- Хранилище данных NoSQL запрашивается для извлечения временной шкалы пользователя в случае промаха кеша.
- Неактивные пользователи получают домашнюю хронологию с помощью модели извлечения (разветвления при загрузке).
- Активные пользователи, подписавшиеся на пользователей-знаменитостей, используют гибридную модель для получения домашней хроники (элементы ленты от знаменитостей объединяются по требованию)
Ссылки
- Раффи Крикорян, Временные шкалы в масштабе, infoq.com
- Как работает фид, facebook.com
Избранное изображение источник.
Также опубликовано здесь.
Оригинал