Разработка системы новостных лент в социальных сетях

Разработка системы новостных лент в социальных сетях

4 февраля 2023 г.

Ключевые слова новостная лента и хронология взаимозаменяемы. Вот некоторые из сервисов, похожих на новостные ленты социальных сетей:

* Лента новостей Facebook * Хронология Твиттера * Лента в инстаграме * Канал подкастов Google * Хронология новостей Google * Лента на Этси * Подача * Лента Реддит * Средняя подача * Лента Quora

Требования

  • Лента новостей пользователя должна создаваться почти в режиме реального времени на основе активности в ленте людей, на которых подписан пользователь.
  • Элементы канала содержат текстовые и мультимедийные файлы (изображения, видео)

Хранение данных

Схема базы данных

Facebook newsfeed; Database schema

* Основными объектами базы данных являются таблица Users, таблица FeedItems и таблица Follows. * Связь между таблицами Users и FeedItems1-ко-многим. * Связь между таблицами Users и Followsмногие ко многим. * Follows – это сводная таблица, представляющая отношения (отслеживание-подписчик) между пользователями

Тип хранилища данных

  • Медиафайлы (изображения, видео) хранятся в управляемом хранилище объектов, таком как AWS S3
  • В базе данных SQL, такой как Postgres, хранятся метаданные пользователя (подписчики, личные данные)
  • Хранилище данных NoSQL, такое как Cassandra, хранит временную шкалу пользователя.
  • Кэш-сервер, такой как Redis, хранит предварительно созданную временную шкалу пользователя.

Дизайн высокого уровня

Facebook Newsfeed; Home timeline

* Сервер хранит элементы фида на кеш-серверах и в хранилище NoSQL. * Сгенерированная новостная лента хранится на кэш-сервере * Публикация ленты для неактивных пользователей не осуществляется, но используется модель вытягивания (разветвление при загрузке). * Публикация фида для активных пользователей, не являющихся знаменитостями, основана на модели push (разветвление при записи). * Публикация ленты для знаменитостей основана на гибридной двухтактной модели. * Клиент получает новостную ленту с серверов кеша

Написать путь

Facebook newsfeed; Write path

  1. Клиент создает HTTP-соединение с балансировщиком нагрузки, чтобы создать элемент фида.
  2. Балансировщик нагрузки делегирует клиентское подключение веб-серверу со свободной емкостью.
  3. Запросы на запись для создания элементов фида ограничены.
  4. Элемент фида сохраняется в очереди сообщений для асинхронной обработки, и клиент получает немедленный ответ
  5. Служба разветвления распределяет элемент канала по нескольким службам для создания канала новостей для подписчиков клиента.
  6. В хранилище объектов сохраняются файлы видео или изображений, встроенные в элемент фида.
  7. Магазин NoSQL сохраняет временную шкалу пользователей (элементы фида в обратном хронологическом порядке).
  8. В базе данных SQL хранятся метаданные пользователей (взаимоотношения пользователей) и элементы канала.
  9. На кэш-сервере хранится ограниченное количество элементов ленты для пользователей с определенным порогом подписчиков.
  10. Идентификаторы элементов ленты хранятся на сервере кэша пользовательской временной шкалы для дедупликации.
  11. Служба создания каналов подписывается на службу разветвления для получения любых обновлений.
  12. Служба создания канала запрашивает хранящуюся в памяти службу информации о пользователе, чтобы определить подписчиков пользователя и категорию пользователя (активные пользователи, не являющиеся знаменитостями, неактивные, знаменитые пользователи).
  13. Служба создания фидов создает домашнюю хронику для активных пользователей, не являющихся знаменитостями, используя модель push-уведомлений (разветвление при записи) за линейное время O(n), где n – количество подписчиков.
  14. Элементы канала ранжируются, сортируются и объединяются для создания домашней временной шкалы для пользователя.
  15. Временная шкала для активных пользователей хранится на кэш-сервере для быстрого поиска.
  16. Фид для неактивных пользователей не публикуется, но используется модель вытягивания (разветвление при загрузке).
  17. Публикация фидов для знаменитостей основана на гибридной модели push-pull (объединение элементов фида знаменитостей с домашней хроникой пользователя по запросу)
  18. В качестве альтернативы при публикации ленты для знаменитостей можно использовать модель push-уведомлений только для онлайн-подписчиков в пакетном режиме (неоптимальное решение).

Читать путь

Facebook newsfeed; Read path

  1. Клиент выполняет DNS-запрос для разрешения имени домена.
  2. Клиент запрашивает CDN, чтобы проверить, кэшируются ли элементы канала для домашней временной шкалы в CDN.
  3. Клиент создает HTTP-соединение с балансировщиком нагрузки.
  4. Балансировщик нагрузки делегирует клиентское подключение веб-серверу со свободной емкостью.
  5. Запросы на чтение для получения ленты новостей ограничены по скорости
  6. Веб-сервер запрашивает у службы временной шкалы новостную ленту.
  7. Служба временной шкалы запрашивает службу информации о пользователе, чтобы получить список подписчиков и определить категорию пользователя (активный, неактивный, подписанный на знаменитостей)
  8. Кэш домашней временной шкалы запрашивается для получения списка идентификаторов элементов фида.
  9. Элементы канала извлекаются из кэш-сервера элементов канала путем выполнения операции MGET в Redis.
  10. Когда клиент выполняет запрос на получение временной шкалы другого пользователя, служба временной шкалы запрашивает сервер кэширования временной шкалы пользователя.
  11. Последователь базы данных SQL (реплика) запрашивается при промахе кэша
  12. Медиафайлы, встроенные в элементы ленты, извлекаются из хранилища объектов.
  13. Хранилище данных NoSQL запрашивается для извлечения временной шкалы пользователя в случае промаха кеша.
  14. Неактивные пользователи получают домашнюю хронологию с помощью модели извлечения (разветвления при загрузке).
  15. Активные пользователи, подписавшиеся на пользователей-знаменитостей, используют гибридную модель для получения домашней хроники (элементы ленты от знаменитостей объединяются по требованию)

Ссылки


Избранное изображение источник.

Также опубликовано здесь.


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE