Что такое поток подачи? С точки зрения пользователя, в различных мобильных приложениях, особенно социальных, мы можем видеть, что контент, за которым мы следим, и динамика наших друзей объединены в список (наиболее типичный из них — WeChat Moments), который представляет собой форму потока каналов. .
Feeds Основные функции потоков: агрегирование информации Он собирает нужную вам информацию на основе вашего поведения, а затем предоставляет ее вам в легкодоступной форме. Этот метод представляет собой метод потока информации. Вам нужно только продолжать проводить пальцем по различной информации, без необходимости искать ее самостоятельно или пассивно получать информацию. Например: Weibo использует ваш список наблюдения, чтобы понять, какие источники информации вам могут понадобиться, а затем объединяет различную информацию в виде временной шкалы, чтобы передать ее вам. Позже появился Douyin’s Guess You Like. Он не требует вашего ручного внимания. Вместо этого он формирует ваш пользовательский портрет на основе вашего времени чтения, лайков и другой информации, тем самым агрегируя информацию, которая может вас заинтересовать. Поток «Ленты» в Moments объединяет информацию, которая может вам понадобиться, на основе ваших отношений с друзьями.
С точки зрения агрегации источников информации существует три сценария агрегации источников информации в Feeds:
С точки зрения логики отображения его можно разделить на два типа:
имя | иллюстрировать | Примечание |
---|---|---|
Feed | Каждый статус или сообщение в ленте ленты — это лента. Например, статус в Moments — это лента, а публикация Weibo — это лента. | никто |
Поток каналов | Поток каналов, по сути, представляет собой поток данных. Основная логика заключается в том, что серверная система передает «информационный контент нескольких издателей» «множеству получателей» посредством «таких отношений, как отслеживание коллекций и блокировка. Например, публичные учетные записи подписываются на сообщения». | Три основные характеристики: небольшое количество людей публикует; корреляция, основанная на подписке, большинство людей читают информацию; |
Timeline | Временная шкала на самом деле представляет собой тип потока новостей Weibo и WeChat Moments. Однако, поскольку тип временной шкалы появляется раньше, является наиболее широко используемым и наиболее известным, временная шкала иногда используется для представления. питающие потоки. | также называется временной шкалой |
Следуйте странице Хронология | Страницы, на которых отображаются сообщения ленты других людей, например «Моменты», домашняя страница Weibo и т. д. | Сообщения, которые может видеть каждый пользователь, также называются папкой «Входящие». |
Персональная страница Хронология | Страницы, на которых отображаются отправленные вами сообщения ленты, например фотоальбомы в WeChat, личные страницы в Weibo и т. д. | Публикуемые вами сообщения, также называемые исходящими, будут записываться в вашу папку «Исходящие». Сообщения в почтовых ящиках других людей также синхронизируются с исходящими ящиками их подписчиков. |
Ленты временной шкалы — это системы потоковой передачи каналов, которые вызывают каналы на основе отношений между пользователями, а затем сортируют их по времени публикации.
Функциональность, которую необходимо разработать для модели каналов временной шкалы, включает в себя:
Общие особенности (проблемы) систем потоковой передачи каналов:
На основе вышеперечисленных функций, которые необходимо разработать, а также общих проблем, дополнительно абстрагируйте проблему и предложите решение.
Некоторое время назад из-за того, что знаменитость опубликовала личное сообщение, количество посещений Weibo резко возросло, пока система не вышла из строя. Weibo внесла ряд изменений в расширение и объявила, что пропускная способность системы может поддерживать «одновременное снижение» нескольких знаменитостей. Вопрос о ледигаге был задан в журнале Data-Dense Systems Design (DDIA):
Здесь выводятся два варианта: читать распространениеиписать распространение вопрос
читать распространениевыполнить:
читать распространение Пагинациявопрос: Зависит от Вчитать При распространении почтовый ящик пользователя рассчитывается в режиме реального времени. При перелистывании страницы необходимо перейти ко всем местам, на которые направлен фокус. Извлеките определенное количество данных из исходящего ящика человека. Чтобы тянуть назад, вам необходимо записать текущее значение тяги в поле для записи. write_last_id, столько внимания, сколько записей. write_last_id. Затем при перелистывании страницы вам нужно использовать эти write_last_id для получения нового определенного объема данных (например, фрагментов page_size). Затем используйте новый список входящих сообщений, состоящий из этих данных, для фильтрации page_size Бар возвращается на передний план. При этом также необходимо обновить адрес в графе для записи, куда он собственно вытащил сообщение. write_last_id и сохраните. В следующий раз, когда вы перевернете страницу, эта партия write_last_id Он будет использоваться в качестве основы для позиционирования в следующий раз, когда вы перевернете страницу.
Подведите итог: читать распространениемодель,Писать feed Логика проста, Экономьте место, Но скорость чтения плохая. Функция пейджинга сложна в реализации
писать распространениевыполнить:
писать распространение Вниз Пагинация: Поскольку в почтовом ящике пользователя написано, Используйте напрямую last_id Просто прокрутите вниз
Подведите итог: писать Режим распространения чтения имеет лучшую производительность, но это расточительное хранилище, И большой пользователь V пишет Если распространение будет слишком медленным, будет соблюдена своевременность.
Так называемая нерешительность представляет собой сочетание толчка и притяжения. Мы упомянули выше feeds Потоковая система — это система, которая больше читает и меньше пишет. Так что выбирай писать распространениебудет лучше, Однако для большого вопроса пользователя V, упомянутого выше, усиление письма слишком серьезное. Сильно страдает производительность.
Поэтому мы принимаем двухтактную комбинированную модель:
Конкретные операции:
Когда мы решили проблему «большого V» писать распространениепросназад, перед нами встал новый вопрос:
Для вышесказанногоизвопрос, Нам нужна система классификации пользователей. Как определить большую букву V , как определить активного пользователя
Ориентация на крупных пользователей V:
Пользовательский рейтинг для активных пользователей:
Если пользователь подписан на слишком много списков, список входящих сообщений пользователя станет важным ключом, что повлияет на производительность таких пользователей.
писать В режиме распространения сообщения пользователя могут распространяться медленно, но удаления и изменения должны распределяться равномерно. Если скорость слишком медленная, возникнет вопрос о своевременности. Более того, если данные действительно будут удалены, это может повлиять на Поток. это пейджинговая функция)
В этом случае, Мы можем использовать механизм мягкого удаления + отложенного удаления: Мягкое удаление означает, что содержимое сообщения фактически не удаляется, но сообщение переводится в состояние удаленного без распространения. Таким образом, когда пользователь читает сообщение в своем почтовом ящике, он первым получает сообщение. Id После этого перейдите в базу данных, чтобы узнать содержимое сообщения, затем оцените статус и отфильтруйте его, а также удалите удаленный статус, не возвращая его во внешний интерфейс. В это время также необходимо снова получить данные и заполнить пейджинговый контент. Отложенное удаление означает, что если сообщение отфильтровано, оно фактически удаляется из папки «Входящие» пользователя (соответствующий идентификатор в zset redis удаляется для завершения Поток. нужно обновить таблицу)
Конкретный план реализации механизма мягкого удаления + отложенного удаления выглядит следующим образом: читать распространение Вернитесь назад: Мы в написании распространениечас,Только Писать Понятноодининформацияidприезжатьпользовательиз Входящие中,так,Когда пользователь запрашивает информацию о входящих сообщениях,Для проведения обзора информация будет насыщенной (такое решение сэкономит больше памяти, чем запись контента напрямую во входящие),Сокращение избыточности,В то же время сообщение «никто удален» необходимо распространить).
общий Архитектурный дизайнследующее:
feed Основная логика заключается в основном в публикации сообщений + извлечении feeds поток, Основной нижний слойхранилищедляТаблица реляционных данных хранит исходное содержимое сообщения., два redis list Для входящих и исходящих почтовых ящиков
Структура хранения таблицы сообщений устроена следующим образом:
Полеимя | Полеиллюстрировать | Примечание |
---|---|---|
msg_id | Уникальный идентификатор сообщения | |
msg_title | Название сообщения | |
msg_content | Содержание сообщения | хранилище json |
msg_type | Тип сообщения | Например, текст, видео и т. д. |
msg_status | статус сообщения | Используется для определения статуса, например проверки, мягкого удаления и т. д. |
extra_info | Расширенная информация | Используется для расширения бизнеса, хранения данных JSON. |
sender_id | отправитель | |
create_at | Отправить время | |
modify_at | время модификации |
Использование входящего/исходящего ящика redis zset хранилище, Возьмем, к примеру, почтовый ящик: ключ это идентификатор получателя
,zvalueдляUid отправителя+идентификатор сообщения
,zscore:выпускать Временная метка
. Благодаря такому дизайну вычисления можно перенести вниз, и каждый раз, когда сообщение обновляется во входящих, оно будет сортироваться само по себе.
1 | key: идентификатор получателя -> value: Uid отправителя+msg_id -> scroe: Временная метка публикации сообщения |
---|
При публикации сообщения ленты процесс выглядит следующим образом:
Процесс обновления ленты пользователями выглядит следующим образом: