Для тех из вас, кто не знает, Winds (популярное приложение для RSS и подкастов с открытым исходным кодом) работает на Stream - предложении SaaS, которое специально предназначено для поддержки новостей и каналов активности. Если вы хотите получить новые знания о каналах, у нас есть великолепное 5-минутное руководство, в котором рассказывается, как использовать Stream. Если вы уже знакомы с Stream и / или чудесами технологии кормления, читайте дальше!

Stream позволяет Winds иметь такие возможности, как:

  1. Возможность следить за RSS-потоками или подкастами.
  2. Уведомления в режиме реального времени об изменениях в ленте, позволяющие Winds немедленно отображать новый контент, когда он доступен.
  3. Рекомендации для новых RSS-каналов и подкастов.

Создание лент действий, которые были бы одновременно масштабируемыми, и релевантными, сложно. Традиционно компании полагались на Cassandra или Redis для создания своих каналов. Строительные корма в доме требуют много времени, дороги и сложны в обслуживании. Stream упрощает и рентабельность создания масштабируемого и релевантного фида. Каналы обычно загружаются за 11 мсек, и с 300+ миллионами конечных пользователей Stream прошел боевые испытания и выдержал одни из самых суровых условий.

В этом коротком посте мы расскажем, как мы используем Stream для отслеживания взаимосвязей, функций в реальном времени и обнаружения контента в Winds, а также о том, как это позволяет нашей команде легко масштабировать приложение и предлагать свежие , релевантный контент для наших пользователей в мгновение ока. Наслаждаться! 👏

Что такое фид? 🤔

Канал описывает структуру, которую вы видите сегодня во многих популярных социальных сетях; каналы позволяют пользователям прокручивать контент и взаимодействовать с ним во время его просмотра. С технической точки зрения каналы являются частью спецификации Activity Stream; существует официальная спецификация для потоков активности (также известных как каналы активности). Официальную документацию можно найти здесь.

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

Stream предоставляет следующие «типы каналов»:

  • Плоский - наиболее распространенный стиль подачи. Этот тип канала позволяет вам писать в конкретный канал (например, шкалу времени и отображать содержимое в хронологическом порядке). За плоским фидом также могут следовать другие фиды, а также поверхностные уведомления в реальном времени (это делается с помощью подключения к веб-сокету, встроенного прямо в наш JavaScript SDK).
  • Агрегированный. Этот тип фида представляет собой расширенный фид, позволяющий группировать и отображать действия с использованием «формата агрегирования».
  • Уведомление. Думайте об этом типе фида как об «агрегированном фиде» с расширенными функциями. Его можно изменить так, чтобы элементы в ленте можно было пометить как просмотренные или прочитанные (вспомните ленту уведомлений Facebook).

В качестве реального примера: все приложение Facebook представляет собой почти одну гигантскую новостную ленту, которая использует настраиваемые алгоритмы для отображения контента, с которым вы, скорее всего, будете взаимодействовать (Stream также может сделать это с помощью собственной настраиваемой персонализации).

Канал уведомлений (раскрывающийся список с обновлениями) поддерживает взаимодействие пользователей с контентом и автоматически отмечает элементы как просмотренные или прочитанные в зависимости от их взаимодействия с контентом. Facebook является одним из примеров, однако Twitter и Pinterest - другими примерами популярных приложений, использующих технологию каналов.

Добавление занятий в поток в Winds 🏃

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

С учетом сказанного, каждый раз, когда наши сотрудники анализируют контент RSS или подкаста, они создают запись в MongoDB. После возврата обратного вызова из вставки MongoDB рабочие начинают перемешивать все статьи (для RSS-каналов) или эпизоды (для каналов подкастов), сохраняя их в MongoDB и, наконец, сохраняя их в Stream. Как и выше, база данных возвращает уникальное значение _id, которое мы используем как «foreign_id» в Stream.

К счастью, Stream упрощает добавление действий в наши каналы. Это можно сделать с помощью REST API или любого SDK, доступного в Stream. С помощью JavaScript SDK добавление статьи в наш RSS-канал выглядит примерно так:

Разберем этот пример:

  • актер - это пользователь (или система), выполняющий действие.
  • глагол - это действие, предпринимаемое пользователем (или системой).
  • объект - это ссылка на объект активности (в нашем случае уникальный идентификатор)
  • время - это обязательное значение и время действия (когда оно было создано) - это значение обеспечивает уникальность и дает возможность позже изменить действие при необходимости.
  • foreign_id: это уникальный идентификатор из базы данных приложения для действия (и используется для поиска, если вам потребуется внести изменения позже).

Примечание. Термин "канал" часто используется в этом разделе и может выглядеть взаимозаменяемым. Пожалуйста, не путайте - канал RSS или подкаста - это контент, доступный по заданному URL-адресу канала (например, https://somewebsite.com/rss.xml), тогда как канал активности относится только к Stream.

Если вы хотите прочитать более подробную информацию, у нас есть полный список с описаниями на сайте Stream здесь.

Подписки 🎢

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

В Winds у нас много отношений. Наиболее важные и легкие для понимания отношения - это отношения между пользователями и «каналами» RSS и подкастов, которым они следят.

Примечание. В этом смысле каналы ссылаются на группы каналов в потоке, а НЕ на URL-адрес канала.

Именно в группах каналов «user_article» и «user_episode» поддерживаются отношения «следовать». Ниже приведен простой пример сценария, который показывает, как создать связь слежения между несколькими элементами в родительском RSS-канале с помощью команды «followMany» в JavaScript SDK:

Примечание. Можно использовать только «плоские» типы подачи. Кроме того, фид не может следовать за собой.

Одна из замечательных функций Winds - это импорт файлов «.OPML». OPML - это стандарт для импорта и экспорта RSS-каналов. Он написан на XML, поэтому мы выполняем весь анализ, создаем каналы, как указано выше, а затем выполняем то, что называется массовым отслеживанием.

Если вас интересует массовая подписка, посмотрите пример на следующий фрагмент:

Дополнительную информацию о следующих лентах можно найти в нашей документации.

Структура подачи потока для ветров 🛠

Если у вас была возможность изучить кодовую базу Winds или использовать приложение, вы знаете, что оно сложное. Чтобы облегчить различные функции в Winds, мы в значительной степени полагаемся на Stream для обработки наших каналов. Вы можете представить себе одну группу каналов как таблицу в базе данных, где каждая строка представляет собой действие.

Вот краткое изложение структуры группы фидов Winds:

  • подкаст (плоский)
  • user_article (плоский)
  • user_episode (плоский)
  • rss (плоский)

Как и предполагалось, каждый фид хранит связанные данные. Например, когда мы анализируем RSS-канал или канал подкаста, мы вставляем новое действие в соответствующие каналы. Все отслеживаемые статьи и выпуски хранятся либо в user_article, либо в user_episode, оба из которых связаны с RSS и подкастами через «отношения отслеживания» в Stream. Отношения слежения - это то, что позволяет нам установить связь между пользователем и контентом, который они выбрали для потребления.

Теперь, когда у нас есть отношения отслеживания, достаточно просто отправить запрос GET к Stream API, чтобы получить следующее. Как только мы получаем следующее, мы вызываем API к нашей базе данных для Winds (MongoDB) и используем ответ для «обогащения» данных. После того, как он был расширен, мы можем отображать все данные новостной ленты пользователю внутри Winds.

Примечание. Обогащение - это процесс взятия небольшого подмножества данных (например, объекта с идентификатором для нашего подкаста) и расширения его данными из нашей базы данных. Это важный процесс, потому что он позволяет нам поддерживать полезную нагрузку в управляемом размере, тем самым уменьшая сетевой ввод-вывод и увеличивая скорость передачи. Также помните, что важно никогда не хранить личную информацию (PII) внутри Stream.

Как мы используем корма при ветре 🍭

Ленты широко используются в Winds. Фактически, мы используем каналы для отображения почти всего в Winds. На приведенном ниже экране мы используем следующие каналы:

  • RSS (последние статьи)
  • Подкаст (последние выпуски)
  • Discover - это комбинация каналов RSS и подкастов на основе Stream Personalization.

Одна интересная часть Winds, на которую стоит обратить внимание, заключается в том, что в разделе «Discover» («Обнаружение») показано мэшап из рекомендуемых каналов RSS и подкастов; Рекомендации по RSS и подкастам основаны на двух конечных точках персонализации, предоставляемых Stream. Используя персонализацию, мы можем отображать контент, с которым пользователь, скорее всего, будет взаимодействовать, исходя из его предыдущих кликов, чтения, прослушивания и общее содержание приложения Winds.

Сокеты в реальном времени и веб-сокеты

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

Получение рекомендаций из потока 💭

Stream позволяет легко добавлять персонализированные каналы в ваше приложение. По мере того, как ваши пользователи взаимодействуют с вашим приложением, Stream начинает понимать, что им интересно. Благодаря аналитическим данным возможности безграничны. Вот лишь несколько примеров использования, которые мы видели на практике:

  • Персонализировать фиды
  • Создать предложения по подписке
  • Оптимизировать электронную почту
  • Рекомендации по продукту
  • Рекомендации по содержанию

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

Персонализация играет важную роль в Winds. Он поддерживает наше обнаружение контента в целом.

Раздел обнаружения основан на ваших интересах, установленных во время создания вашей учетной записи, кликов, чтения и прослушивания. Со всеми этими данными Stream приступает к работе и обрабатывает несколько сложных алгоритмов, чтобы рекомендовать контент.

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

Благодарю вас! 👋

Спасибо, что нашли время, чтобы прочитать это. Я надеюсь, что этот пример пошагового руководства помог вам лучше понять, как работают каналы.

Если вам интересно узнать о Stream и вы хотите попробовать наш API, у нас есть 5-минутное руководство, которое проведет вас через все шаги для различных типов каналов, описанных выше. Я настоятельно рекомендую попробовать. Кроме того, Как Stream использует RocksDB, Raft и Go для поддержки каналов для более чем 300 миллионов пользователей - отличный вариант для тех, кто интересуется архитектурой Stream.

Если вы еще не скачали или не зарегистрировались в Winds, он доступен для Интернета, macOS, Linux и Windows - вы можете начать работу с Winds здесь.

Как всегда, если у вас есть какие-либо вопросы или комментарии, пишите их в комментариях ниже!