Обзор конструкции системы потоковой передачи каналов
Обзор конструкции системы потоковой передачи каналов

Обзор потока каналов

Что такое поток подачи? С точки зрения пользователя, в различных мобильных приложениях, особенно социальных, мы можем видеть, что контент, за которым мы следим, и динамика наших друзей объединены в список (наиболее типичный из них — WeChat Moments), который представляет собой форму потока каналов. .

Feeds Основные функции потоков: агрегирование информации Он собирает нужную вам информацию на основе вашего поведения, а затем предоставляет ее вам в легкодоступной форме. Этот метод представляет собой метод потока информации. Вам нужно только продолжать проводить пальцем по различной информации, без необходимости искать ее самостоятельно или пассивно получать информацию. Например: Weibo использует ваш список наблюдения, чтобы понять, какие источники информации вам могут понадобиться, а затем объединяет различную информацию в виде временной шкалы, чтобы передать ее вам. Позже появился Douyin’s Guess You Like. Он не требует вашего ручного внимания. Вместо этого он формирует ваш пользовательский портрет на основе вашего времени чтения, лайков и другой информации, тем самым агрегируя информацию, которая может вас заинтересовать. Поток «Ленты» в Moments объединяет информацию, которая может вам понадобиться, на основе ваших отношений с друзьями.

Классификация потоков каналов

С точки зрения агрегации источников информации существует три сценария агрегации источников информации в Feeds:

  • никто Зависимости: Например, страница рекомендаций Douyin может создать портрет пользователя на основе вашего рабочего поведения, а затем сопоставить агрегированную информацию.
  • Односторонние зависимости: Например, на Weibo я фокусируюсь Если вы нажмете на определенную большую букву V, вы сможете получить его информацию. агрегирование здесь информация основана на одностороннем фокусе отношения
  • Двунаправленные в зависимости: например, WeChat Moments,Нужно два человека, чтобы подружиться друг с другом,Только тогда информация другой стороны будет объединена в ваш собственный круг друзей.

С точки зрения логики отображения его можно разделить на два типа:

  • Взвешенная рекомендация: например, Douyin, которая рекомендует информацию на основе скрытых интересов и отображает каналы, отсортированные по весу.
  • Отображение временной шкалы: например, Weibo и Moments, получение информации на основе взаимоотношений пользователей и отображение каналов в хронологическом порядке.
Терминология модели потоковой передачи каналов

имя

иллюстрировать

Примечание

Feed

Каждый статус или сообщение в ленте ленты — это лента. Например, статус в Moments — это лента, а публикация Weibo — это лента.

никто

Поток каналов

Поток каналов, по сути, представляет собой поток данных. Основная логика заключается в том, что серверная система передает «информационный контент нескольких издателей» «множеству получателей» посредством «таких отношений, как отслеживание коллекций и блокировка. Например, публичные учетные записи подписываются на сообщения».

Три основные характеристики: небольшое количество людей публикует; корреляция, основанная на подписке, большинство людей читают информацию;

Timeline

Временная шкала на самом деле представляет собой тип потока новостей Weibo и WeChat Moments. Однако, поскольку тип временной шкалы появляется раньше, является наиболее широко используемым и наиболее известным, временная шкала иногда используется для представления. питающие потоки.

также называется временной шкалой

Следуйте странице Хронология

Страницы, на которых отображаются сообщения ленты других людей, например «Моменты», домашняя страница Weibo и т. д.

Сообщения, которые может видеть каждый пользователь, также называются папкой «Входящие».

Персональная страница Хронология

Страницы, на которых отображаются отправленные вами сообщения ленты, например фотоальбомы в WeChat, личные страницы в Weibo и т. д.

Публикуемые вами сообщения, также называемые исходящими, будут записываться в вашу папку «Исходящие». Сообщения в почтовых ящиках других людей также синхронизируются с исходящими ящиками их подписчиков.

Основы дизайна потока каналов временной шкалы

Ленты временной шкалы — это системы потоковой передачи каналов, которые вызывают каналы на основе отношений между пользователями, а затем сортируют их по времени публикации.

точки функций дизайна каналов временной шкалы

Функциональность, которую необходимо разработать для модели каналов временной шкалы, включает в себя:

  1. Пользователь публикует/удаляет фид
  2. пользовательсосредоточиться на/Отменасосредоточиться на Чтоонпользователь
  3. Пользователь просматривает поток сообщений, на которые он подписался (Поток каналы): Пользователи могут просматривать новости из подписанного источника новостей выпускать в виде временной шкалы. Удаление и обновление сообщений будут восприниматься пользователями в режиме реального времени. Поток перелистывание страниц пользователя вопрос: Перелистывание страниц пользователя Поток образы, независимо от Поток Сколько контента было обновлено каналом? В настоящее время вы просматриваете последнюю информацию, которую видели? Поток Предыдущая информация была удалена и проигнорирована.
  4. Пользователи могут просматривать домашнюю страницу пользователя и просматривать каналы, опубликованные другими пользователями.
  5. Пользователи читают/лайкают/комментируют/пересылают и т. д. в определенном канале.
  6. Дополнительные функции: публикация проверки соответствия требованиям безопасности контента/конфигурация черного и белого списков и т. д.
Проблемы, с которыми сталкивается дизайн

Общие особенности (проблемы) систем потоковой передачи каналов:

  1. В реальном времени: сообщения генерируются в реальном времени, обрабатываются в реальном времени и отправляются в реальном времени. Общие требования к производительности выше
  2. Массивныйданные: Новости поступают из разных источников данных, Количество генерируемых новостей огромно
  3. Читайте больше и пишите меньше: общее соотношение чтения и записи составляет 100:1. Когда один пользователь публикует канал, его будут читать 100 пользователей.

На основе вышеперечисленных функций, которые необходимо разработать, а также общих проблем, дополнительно абстрагируйте проблему и предложите решение.

Как подписчик читает фид после того, как издатель публикует его?

Некоторое время назад из-за того, что знаменитость опубликовала личное сообщение, количество посещений Weibo резко возросло, пока система не вышла из строя. Weibo внесла ряд изменений в расширение и объявила, что пропускная способность системы может поддерживать «одновременное снижение» нескольких знаменитостей. Вопрос о ледигаге был задан в журнале Data-Dense Systems Design (DDIA):

  1. ladygaga Имея миллионы поклонников,Тогда пользователи в списке фанатов ID size то есть 1000W,Таким образом каждый раз RPC Оба извлекаются из службы взаимоотношений с пользователями. 1000W изданныеколичество, Трудно вернуться за короткое время, затем опубликовано feed Также лайкните это в почтовых ящиках всех ваших поклонников. feedID, В худшем случае эта операция приведет к 1000W Второсортный RPC вызов, В то же время это пустая трата места в хранилище. Из-за публикации статьи feed Нужно поставить хранилище 1000W делиться
  2. Что Второсортный 1000W Второсортный RPC Очевидно, что звонок не может быть завершен в течение короткого времени, Это позволит фанатам, написавшим первыми, получать новый контент. Поклонники, написавшие позже, получат сообщения позже. Разница между первым вентилятором и последним вентилятором может составлять десятки минут или даже часов. Пользовательский опыт серьезно пострадает
  3. Эта статья feed Будет генерировать много данных о потреблении (читайте читать/комментарии и т. д.), вызовет это feed Страница сведений QPS остановить, Затем это распространилось на Страница Последующие услуги по раскрытию информации
  4. На это отреагировали пользователи feed Потребительское поведение также включает в себя комментарии, Система увеличения количества комментариев в секунду приведет к изменению поведения согласованности кэша, такого как запись комментариев и количество комментариев.

Здесь выводятся два варианта: читать распространениеиписать распространение вопрос

читать распространение

читать распространениевыполнить:

  1. Подписчики, которых нужно привлечь feeds Час подписчики берут на себя инициативу задавать вопросы, сосредоточить внимание насписок,Запрос выходит один за другимиметьсосредоточиться у человека исходящие не были прочитаны читать фид (временная метка последнего Второсортного извлечения)
  2. Получив несколько идентификаторов каналов, отсортируйте их по временной метке, чтобы получить список, а затем выполните агрегирование и возврат.

читать распространение Пагинациявопрос: Зависит от Вчитать При распространении почтовый ящик пользователя рассчитывается в режиме реального времени. При перелистывании страницы необходимо перейти ко всем местам, на которые направлен фокус. Извлеките определенное количество данных из исходящего ящика человека. Чтобы тянуть назад, вам необходимо записать текущее значение тяги в поле для записи. write_last_id, столько внимания, сколько записей. write_last_id. Затем при перелистывании страницы вам нужно использовать эти write_last_id для получения нового определенного объема данных (например, фрагментов page_size). Затем используйте новый список входящих сообщений, состоящий из этих данных, для фильтрации page_size Бар возвращается на передний план. При этом также необходимо обновить адрес в графе для записи, куда он собственно вытащил сообщение. write_last_id и сохраните. В следующий раз, когда вы перевернете страницу, эта партия write_last_id Он будет использоваться в качестве основы для позиционирования в следующий раз, когда вы перевернете страницу.

Подведите итог: читать распространениемодель,Писать feed Логика проста, Экономьте место, Но скорость чтения плохая. Функция пейджинга сложна в реализации

писать распространение

писать распространениевыполнить:

  1. При публикации канала запросите список поклонников издателя и напишите идентификатор опубликованного канала в почтовый ящик поклонника.
  2. При чтении непосредственно читайте собственный почтовый ящик, а затем упаковывайте его в список каналов для совокупного отображения.

писать распространение Вниз Пагинация: Поскольку в почтовом ящике пользователя написано, Используйте напрямую last_id Просто прокрутите вниз

Подведите итог: писать Режим распространения чтения имеет лучшую производительность, но это расточительное хранилище, И большой пользователь V пишет Если распространение будет слишком медленным, будет соблюдена своевременность.

План улучшения – комбинация «тяни-тяни»

Так называемая нерешительность представляет собой сочетание толчка и притяжения. Мы упомянули выше feeds Потоковая система — это система, которая больше читает и меньше пишет. Так что выбирай писать распространениебудет лучше, Однако для большого вопроса пользователя V, упомянутого выше, усиление письма слишком серьезное. Сильно страдает производительность.

Поэтому мы принимаем двухтактную комбинированную модель:

  1. Для больших пользователей V: читать распространение, генерировать feed список
  2. Для обычных пользователей, писать распространение, генерировать feed список

Конкретные операции:

  1. Если при публикации ленты стоит большая буква V, она будет записана только в ваш собственный почтовый ящик.
  2. выпускать feed час, Если это обычный пользователь, выполните запись распространениевытолкнуть
  3. читать feed час, читать Выбиратьсосредоточиться насписок определяет, какие пользователи большие V, Вытащите исходящие из Big V (также следуйте приведенным выше инструкциям). write_last_id тянуть), Параллельно читать забирайте свой почтовый ящик, получитьдва feedID list слить
Продолжайте совершенствоваться – стратегия рейтинга пользователей

Когда мы решили проблему «большого V» писать распространениепросназад, перед нами встал новый вопрос:

  1. Как идентифицировать крупных пользователей V, чтобы избежать дрожания производительности, вызванного граничным вопросом (количество поклонников пользователя является динамической величиной, Как отметить пользователя как влиятельного человека? )
  2. app Зарегистрированных пользователей много, Но активных пользователей очень мало, Если все почтовые ящики хранилища для определенного пользователя будут занимать слишком большую стоимость хранилища (хранилище отходов)

Для вышесказанногоизвопрос, Нам нужна система классификации пользователей. Как определить большую букву V , как определить активного пользователя

Ориентация на крупных пользователей V:

  1. Определите, является ли пользователь большим V, с помощью таких средств, как количество поклонников / расчет популярности в автономном режиме / маркировка модели машинного обучения и т. д. и будет большимVделатьдля Что-то вродепользовательперенос этикеткихранилище
  2. Используйте потоковые вычисления, такие как flink, чтобы определить, является ли это большим V-постом.
  3. Пользователи Big V могут только обновиться, но не понизить версию. После понижения версии им необходимо вернуться в почтовые ящики всех фанатов (переписать почтовые ящики всех фанатов).

Пользовательский рейтинг для активных пользователей:

  1. Определите, является ли пользователь активным пользователем, на основе ежедневной/ежемесячной активности и даже поддерживайте уровень активности.
  2. Например, активный уровень в течение месяца,Длина почтового ящика сохраняется на уровне 100 элементов. Еженедельный активный уровень 2,Длина почтового ящика зарезервирована до 300 элементов. Ежедневный активный уровень 3,Длина почтового ящика сохраняется на уровне 1000 элементов (экономия затрат).
Горячее и холодное разделение + предварительная загрузка – проблема с слишком большим входным почтовым ящиком

Если пользователь подписан на слишком много списков, список входящих сообщений пользователя станет важным ключом, что повлияет на производительность таких пользователей.

  1. Чтобы избежать попадания в почтовые ящики пользователей redis Средний ник ограниченный рост, Вы можете установить ограничение на количество активных пользователей, По умолчанию можно обновить максимум 1000 элементов.
  2. Если пользователь продолжает привлекать инсайдеров, Более 1000 позиций, может переродиться в режим вытягивания, идтисосредоточиться на ВОЗизвывод исходящих сообщений Выбирать(Каждый Второсортныйтянуть Выбирать100Статья для обновленияпользовательиз Входящие)
  3. существоватьписать В процессе распространения,добавляйте только новые feed приезжатьсписок, Удалить те, которые превышают лимит кормить(написать новое 100 предметов, Удалить самый старый 100 шт.)
Мягкое удаление + отложенное удаление — проблема удаления при диффузии записи

писать В режиме распространения сообщения пользователя могут распространяться медленно, но удаления и изменения должны распределяться равномерно. Если скорость слишком медленная, возникнет вопрос о своевременности. Более того, если данные действительно будут удалены, это может повлиять на Поток. это пейджинговая функция)

В этом случае, Мы можем использовать механизм мягкого удаления + отложенного удаления: Мягкое удаление означает, что содержимое сообщения фактически не удаляется, но сообщение переводится в состояние удаленного без распространения. Таким образом, когда пользователь читает сообщение в своем почтовом ящике, он первым получает сообщение. Id После этого перейдите в базу данных, чтобы узнать содержимое сообщения, затем оцените статус и отфильтруйте его, а также удалите удаленный статус, не возвращая его во внешний интерфейс. В это время также необходимо снова получить данные и заполнить пейджинговый контент. Отложенное удаление означает, что если сообщение отфильтровано, оно фактически удаляется из папки «Входящие» пользователя (соответствующий идентификатор в zset redis удаляется для завершения Поток. нужно обновить таблицу)

Конкретный план реализации механизма мягкого удаления + отложенного удаления выглядит следующим образом: читать распространение Вернитесь назад: Мы в написании распространениечас,Только Писать Понятноодининформацияidприезжатьпользовательиз Входящие中,так,Когда пользователь запрашивает информацию о входящих сообщениях,Для проведения обзора информация будет насыщенной (такое решение сэкономит больше памяти, чем запись контента напрямую во входящие),Сокращение избыточности,В то же время сообщение «никто удален» необходимо распространить).

проектирование системы каналов временной шкалы

Архитектурный дизайн

общий Архитектурный дизайнследующее:

  • User Svr: хранить информацию о пользователе, Возможности обслуживания на уровне пользователя
  • Relation Svr: хранить отношения с пользователем,получать Выбиратьсосредоточиться насписок、Фанатыписок и т. д.
  • Item Svr: хранилище исходного содержимого, обеспечивающее выпуск и функции запроса.
  • Comment Svr: хранилище данных комментариев, список комментариев и информация, связанная с комментариями.
  • Feed Svr: хранилище feed Информация, обеспечивающая возможности информационного потока, Например, личная домашняя страница/история просмотров и т. д.
Конструкция основного хранилища

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: Временная метка публикации сообщения

Основные бизнес-процессы примерно реализованы
Опубликовать канал

При публикации сообщения ленты процесс выглядит следующим образом:

  1. Сообщения ленты сначала попадают в службу очереди.
  2. Во-первых, привлеките своих поклонников к списку новостей и определите, являетесь ли вы большим V.
  3. Пишите свои сообщения в ленту Персональная страница Хронология (исходящие).
  4. Если вы большой V, вы привлечете активных пользователей в это время, если вы обычный пользователь, вы привлечете всех своих поклонников; Затем синхронно напишите собственное сообщение фида своим поклонникам, а синхронизированный контент — это идентификатор фида.
Читать ленту

Процесс обновления ленты пользователями выглядит следующим образом:

  1. читать Выбирать Собственныйсосредоточиться наизбольшойVсписок
  2. Перейдите к чтению, чтобы получить свой собственный почтовый ящик,Начальной позицией диапазона является идентификатор последнего фида, полученного из Второсортный Читать.,Конечная позиция может сделать текущее время,Это также может быть МАКС. Затем проверьте содержимое каналов, используя FeesId, запрошенный методом запроса.,И удалите данные, которые были обратимо удалены.
  3. еслииметьтянуть Выбиратьприезжатьсосредоточиться на большом Vсписке, затем Второсортированный одновременный просмотр, получить каждый большой V-список, если сосредоточиться Если у вас 10 больших V, то вам нужно 10 Второсортных посещений.
  4. Результаты шагов 2 и 3 объединяются, сортируются по времени и возвращаются пользователю.
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose