Содержание[Скрывать][Показывать]
Лента Instagram — это платформа для обмена и связи с людьми и вещами, которые важны для вас. Когда вы открываете Instagram или обновляете ленту, фотографии и видео, которые, по нашему мнению, могут вас заинтересовать, будут отображаться вверху.
Лента новостей — это набор элементов, содержащих текст, изображения или видео, созданные другими объектами в системе, предназначенные для чтения вами. Он постоянно меняется, в то время как другие организации публикуют свежие сообщения.
В этом посте мы подробно рассмотрим системный дизайн ленты Instagram. Итак, начнем.
1. Требования
Функциональная необходимость
- Лента новостей пользователя создается из сообщений других сущностей в системе, за которыми пользователь следит или которыми интересуется.
- Текст, изображения и видео можно найти в сообщениях.
- Лента новостей пользователя должна обновляться новыми сообщениями, созданными другими.
Нефункциональный критерий
- Создание новостных лент должно происходить в режиме реального времени. Конечный пользователь должен испытать только 12-секундную задержку.
- Добавление нового сообщения: должно пройти не более 5 секунд, чтобы новое сообщение появилось в запросе новостной ленты после его отправки в систему.
2. Оценка емкости
- По состоянию на март 2021 года население мира составляет всего 7.8 миллиарда человек. Это указывает на то, что 21% населения мира является Facebook DAU (ежедневный активный пользователь), а 32% — Facebook MAU (ежемесячный активный пользователь) (ежемесячный активный пользователь). Это удивительно.
- Давайте представим, что система, которую мы создаем, имеет 1 миллиард DAU, чтобы упростить задачу.
- Предположим, человек следит за 500 людьми или компаниями на Facebook. Группа или страница может считаться сущностью.
Расчетный трафик
Предположим, что один пользователь загружает новостную ленту в среднем 10 раз в день. Таким образом, это примерно 116 тысяч запросов в секунду и 1e10 запросов каждый день.
Оценки хранения
Предположим, мы храним в памяти в среднем 500 сообщений из новостной ленты каждого пользователя для быстрого поиска, и каждое сообщение имеет размер 1 КБ. Итак, 500 КБ на пользователя, 500 ТБ на всех DAU и 5000 компьютеров с 100 ГБ ОЗУ на каждом.
3. API для систем
userId (GUID): пользователь, лента новостей которого загружается.
В параметре необязательных опций доступны следующие поля:
- afterPostId (GUID): получить ленту новостей из поста, следующего за этим. Если не указано, получить самые последние сообщения.
- count (число): максимальное количество сообщений, которое может вернуть каждый запрос. Серверная часть устанавливает максимальное число по умолчанию, если оно не указано.
- excludeReplies (boolean): предотвращает включение ответов в ленту новостей.
- Возвращаемый JSON содержит список элементов ленты новостей.
4. Проектирование базы данных
Юридические лица
- Информация о пользователе
- entityId, имя, описание и отметка времени — обязательные поля.
- Обязательными являются следующие поля: PostId, title, text, authorId и timestamp.
- метка времени, URL и mediaId
Отношения
- За другими пользователями или объектами может следить пользователь. (м:н)
- Автор-сообщение: как пользователи, так и сущности могут создавать сообщения. Предположим, что только пользователи могут создавать сообщения для простоты. (1:n; authorId встраивается).
- Каждый пост сопровождается какой-либо формой СМИ. (1:н)
5. Дизайн высокого уровня
Архитектура
Рабочие процессы
Производство кормов
Когда Джей запрашивает свою ленту новостей, система делает следующее:
- Получите идентификаторы всех людей и вещей, за которыми следит Джей.
- Совокупные сообщения: с учетом этих идентификаторов получите самые последние, популярные и релевантные сообщения.
- Ранжируйте сообщения в соответствии с их релевантностью и временем.
- Кэш: сохраните созданные каналы и отправьте Джею 20 лучших сообщений.
- Когда Джей заканчивает читать первые 20 сообщений, отправляется еще один запрос на получение следующих 20 сообщений.
Раздача корма
Предположим, Джей следит за Аюшем и что Аюш публикует что-то новое. Новостная лента Джея должна быть обновлена системой:
- Получите идентификаторы последователей Ааюша.
- Добавить новые статьи: добавьте сообщение Ааюша в пул новостей подписчиков этих идентификаторов.
- Ранжируйте сообщения в соответствии с их релевантностью и временем.
- Обновите кеш рейтингового поста.
- Подписчики должны быть уведомлены, когда публикуются новые сообщения.
Компоненты
Соединения пользователей поддерживаются веб-серверами.
Указанные выше процедуры выполняются сервером приложений.
Кэш и база данных:
- Пользователь/объект реляционной базы данных
- Реляционная база данных (пост)
- Атрибут изображения/видео: Ааюш сторге
- Метаданные реляционной базы данных
Персонализированные услуги:
- Производство кормов
- Уведомление о фидах
6. Детальный дизайн
Генерация фида
Наивная реализация разветвления чтения:
Проблемы с этой небрежной реализацией включают в себя:
- Пользователи с большим количеством друзей/подписчиков заметят значительное замедление, так как мы должны просеивать, объединять и ранжировать большое количество сообщений.
- Когда пользователь загружает свою страницу, мы строим временную шкалу. Это может быть вялым и иметь много задержек.
- Каждое обновление статуса приведет к обновлению ленты для всех подписчиков для обновлений в реальном времени. Это может привести к значительным задержкам в работе нашей службы создания новостных лент.
Мы можем предварительно сгенерировать хронологию и сохранить ее в памяти для повышения эффективности.
Офлайн-производство (разветвленная запись)
У нас могут быть выделенные серверы, которые постоянно создают и хранят в памяти новостные ленты пользователей. Мы можем просто доставлять новостную ленту из предварительно сгенерированного, сохраненного местоположения, когда пользователь этого захочет.
Сколько элементов канала должен храниться в памяти пользователя?
Адаптируйте на основе вашего поведения использования.
Должны ли мы сделать новостную ленту для всех пользователей (и сохранить ее в памяти)?
- Для тех, кто редко заходит в систему.
- Кэширование на основе LRU — это простой подход.
- Лучшее решение — выяснить, как пользователи входят в систему. Когда это происходит? О каких буднях вы говорите?
Публикация ленты
Разветвление — это процесс отправки сообщения всем вашим подписчикам.
Разветвление чтения (тянуть)
Когда вы запрашиваете новостную ленту, система получает запрос на чтение. Fanout read отправляет запрос на чтение всем вашим подписчикам, прося их прочитать их контент.
Плюсы:
- Процедура написания недорогая.
- При чтении данных проще использовать различные алгоритмы агрегации.
Минусы:
- Для человека с большим количеством подписчиков операция чтения довольно затратна.
- Пользователи не увидят свежих данных, пока не получат их.
- Когда мы регулярно извлекаем самые последние сообщения, трудно найти правильную частоту извлечения, и большинство запросов на включение возвращают пустой ответ, что приводит к трате ресурсов.
Разветвленная запись (push)
Когда вы отправляете новое сообщение, в систему отправляется запрос на запись. Запрос на запись отправляется всем вашим подписчикам, чтобы обновить их новостную ленту с помощью разветвленной записи.
Pro
- Процесс чтения стоит недорого.
В лице
- Для пользователя с миллионами подписчиков записывать процедура слишком дорогая.
Рейтинг фида
Вместо того, чтобы просто упорядочивать каналы в хронологическом порядке, сегодняшние алгоритмы ранжирования дополнительно пытаются гарантировать, что элементы с большей релевантностью имеют приоритет.
- Выберите факторы, которые помогут определить релевантность элемента канала, например количество отметок «Нравится», комментариев и публикаций, время последнего обновления элемента, если статья содержит фотографии или видео, и т. д.
- Рассчитайте балл на основе характеристик.
- Используйте баллы для ранжирования постов.
Настройте ключевые показатели эффективности, такие как удержание пользователей, доход от рекламы и т. д., чтобы увидеть, насколько эффективна наша система ранжирования.
Заключение
Несмотря на то, что Instagram или его материнская компания Facebook — огромная корпорация, она лучше понимает Системный дизайн.
Я изо всех сил старался предоставить вам краткое изложение ленты Instagram.
Я надеюсь, что это было полезно, и что вы будете использовать его с пользой.
Оставьте комментарий