В начале 2018 года я начал работу над MyTelegraph, проектом по созданию первого продукта персонализации для Telegraph. Кульминацией этого стало выступление на Google Next London 2018 вместе с Дэном МакГратом на тему «Создание масштабируемых приложений с помощью Cloud Firestore». Мое участие в Google Next 2018 заключалось в том, чтобы продемонстрировать, как Telegraph использовал Cloud Firestore для реализации, казалось бы, безобидной функции; функция, которая имела решающее значение для успеха проекта и без Cloud Firestore, для создания и поддержки которой потребовались бы значительные инженерные усилия.

В связи с недавним объявлением Google о том, что Cloud Firestore вышел из стадии бета-тестирования и стал общедоступным, кажется, пора написать сообщение в блоге на основе моей презентации о том, как мы использовали Cloud Firestore. К сожалению, презентация не была снята на видео, поэтому, надеюсь, это сообщение в блоге даст тем, кто не сможет присутствовать, краткий обзор того, как мы встроили функцию оповещения в реальном времени в MyTelegraph.

Моя цель - дополнить этот пост сообщениями о том, как мы построили его с точки зрения команды, о преимуществах, которые мы получили от использования Swagger для определения контрактов для командного взаимодействия, обеспечивающего независимый прогресс, и о том, как в конечном итоге это обеспечило основу для восстановления нашей Content API.

Контекст

The Telegraph - один из самых популярных новостных сайтов Великобритании, с журналистами, работающими по всему миру, ежедневно создавая около 250 новых статей на самые разные темы, что приводит к миллионам просмотров страниц.

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

Идея для MyTelegraph

Одна из целей нашей компании - увеличить число активных зарегистрированных читателей до 10 миллионов.

Имея это в виду, MyTelegraph был задуман в конце 2017 - начале 2018 года как инструмент, который «сделает это быстрым и простым для зарегистрированных пользователей находить и взаимодействовать с релевантным содержанием », чтобы побудить пользователей вернуться на сайт.

  • Быстро - предупреждая пользователей, как только новый интересующий их контент становится доступен на сайте на всех их устройствах.
  • Легко - предоставляя пользователям доступ ко всем интересующим их статьям из одного места на сайте со всех своих устройств.
  • Зарегистрированные пользователи - нам нужно знать, кто наши пользователи, чтобы мы могли показывать им интересующие их статьи.
  • Открывайте и вовлекайте - позволяя пользователям выбирать, за какими темами и авторами они хотят следить, а также предоставляя возможность сохранять статьи для последующего чтения.
  • Актуально - подача персонализированного контента для каждого вошедшего в систему пользователя.

Нашей целью было создать и выпустить MVP к Чемпионату мира по футболу FIFA 2018.

Обзор возможностей

Увеличенный снимок экрана, сделанный с мобильного устройства, показанного выше, показывает, как пользователь может следить за автором (или темой), и предупреждение (красная точка в меню «Моя лента»), чтобы пользователь знал, когда в ленте появляется новая статья. сайт, который может их заинтересовать.

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

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

Построение инфраструктуры в реальном времени для поддержки приложения чата не является основной для нашей основной бизнес-цели, которая заключается в доставке контента и улучшении взаимодействия между пользователями и The Telegraph, и это помешало бы нашей способности доставлять сообщения вовремя.

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

Поскольку проект был поставлен перед чемпионатом мира по футболу FIFA, использование Cloud Firestore стало привлекательным.

Однако нам мешали продвигаться вперед с Cloud Firestore из-за отсутствия поддержки (в то время) для использования сервис-воркеров в одном из основных поддерживаемых нами браузеров, функции, которую Cloud Firestore SDK использовал для синхронизации данных между клиентом и сервер.

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

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

Обзор архитектуры

Уже реализовав функцию отслеживания и функцию подачи, мы рассмотрели внедрение Cloud Firestore в приложение, используя его возможности базы данных в реальном времени, а также управление миллионами одновременных подключений специально для оповещения. Это позволило бы нам поэкспериментировать с использованием Cloud Firestore и избавиться от накладных расходов на внедрение и управление базой данных в реальном времени и инфраструктурой оповещения.

На диаграмме выше показан обзор архитектуры MyTelegraph. На высоком уровне:

  • Когда пользователь загружает домашнюю страницу Telegraph, делается запрос на загрузку пользовательских предпочтений.
  • Затем эти настройки регистрируются через прослушиватель событий в браузере пользователя или в собственном приложении в Cloud Firestore, чтобы отслеживать любые изменения в метаданных статьи.
  • Когда пользователь переходит к своему каналу, выполняется проверка таблиц предпочтений, чтобы получить темы и авторов, на которых подписан пользователь.
  • Затем выполняется запрос к хранилищу контента в режиме реального времени, чтобы получить статьи, которые могут заинтересовать пользователя, и создать персонализированный канал, показывающий список статей в обратном хронологическом порядке.
  • После загрузки канала в хранилище настроек добавляется метка времени, указывающая, когда пользователь в последний раз загружал свой канал, и эта метка времени используется для отслеживания изменений в Cloud Firestore в режиме реального времени, предупреждая пользователя о публикации новой статьи. .
  • Наконец, когда новая статья публикуется в нашей системе управления контентом, связанные метаданные статьи загружаются в Cloud Firestore.
  • Затем метка времени статьи используется для сравнения с последним обновлением ленты пользователем и запускает прослушиватели событий на всех устройствах пользователя, если пользователь подписывается на автора, написавшего статью, или на темы, затронутые в статье. .

Структура документа Cloud Firestore

На этом снимке экрана показана коллекция авторов, а также дата и время публикации последней статьи, созданной конкретным автором.

Коллекция тем

На этом снимке экрана показана коллекция тем, а также дата и время создания и публикации статьи, отмеченной определенной темой.

Коллекция LastChecked

И, наконец, это совокупность пользователей, а также дата и время последнего посещения их страницы канала.

Идентификаторы пользователя замаскированы по причинам GDPR.

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

Обзор кода

У меня нет места, чтобы охватить всю реализацию, но ниже я покажу, насколько просто настроить Cloud Firestore для использования в проекте.

Настраивать

Приложение MyTelegraph - это одностраничное приложение, созданное с использованием React и Redux, с рядом библиотек, одной из которых является Cloud Firestore.

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

Получение документов

Есть два способа получить данные, хранящиеся в Cloud Firestore, а именно:

  • Это первый вызов метода get () для получения данных.
  • Второй - настроить прослушиватель на получение событий изменения данных с помощью метода onSnapshot ().

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

Метод 1: get ()

В приведенном выше фрагменте кода показан первый метод путем вызова метода для получения данных.

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

Вы можете получить несколько документов с помощью одного запроса, используя .where () для получения документов, соответствующих определенным условиям, и использовать get () для получения результатов.

Метод 2: прослушиватель событий

Приведенный выше фрагмент кода показывает второй метод, использующий прослушиватель событий, для ответа на события изменения данных. Когда вы устанавливаете прослушиватель (с помощью метода onSnapshot), Cloud Firestore отправляет вашему слушателю первоначальный снимок данных, а затем еще один снимок каждый раз, когда документ изменяется.

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

Заключение

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

Мы сделали это без необходимости становиться экспертами по обмену сообщениями и базам данных в реальном времени, и это уменьшило объем инфраструктуры, которую нам пришлось бы внедрять и поддерживать, если бы мы не использовали Cloud Firestore. Это позволило нашим инженерам сосредоточиться на доставке контента нашим конечным пользователям.

Алекс Мэнсфилд-Скаддан (Alex Mansfield-Scaddan) - архитектор решений для The Telegraph.