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

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

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

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

Добавление нашего собственного решения для веб-сокетов, такого как socket.io, могло бы быть вариантом, но, поскольку мы уже работаем на Google App Engine, использование Firebase имело смысл из-за простоты бессерверного решения.

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

Относительно новой опцией Firebase является новая база данных Firestore, которая предоставляет базу данных в реальном времени на основе технологии Spanner. Однако исходная база данных реального времени Firebase выглядела наиболее подходящим выбором из-за ее более низкой задержки и, скорее всего, ее цены. Хотя мы не проводили тесты, база данных в реальном времени взимает плату за хранимые и передаваемые данные, в то время как Firestore взимает плату за чтение и запись. Поскольку мы записываем и передаем небольшие объемы данных, вероятно, база данных реального времени окажется дешевле.

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

{ "rules": { ".read": "true", ".write": "false" } }

На стороне сервера изменения были изолированы от одного обратного вызова. Parse позволяет зарегистрировать хук postSave для типа базы данных, поэтому хук был добавлен для типа Chat. Он проверяет, произошло ли обновление чата, которое может заинтересовать клиента, т. е. изменилось ли состояние или отправлено новое сообщение, или пользователь был добавлен/удален из группового чата. Если это так, то для каждого пользователя в чате путь chatsLastUpdated/USER_ID обновляется двумя значениями: идентификатором чата и отметкой времени.

В клиентском приложении (которое может быть либо в мобильном приложении, либо в веб-приложении, либо в PWA) он подписывается на путь в базе данных реального времени для вошедшего в систему пользователя (chatsLastUpdated/USER_ID). Когда обновление поступает через приложение, оно вызывает сервер App Engine для получения последних обновлений для чатов пользователей, и если обновление предназначено для просматриваемого в данный момент чата, то приложение также запрашивает последние сообщения для этого чата.

До интеграции с Firebase служба чата в приложении периодически запрашивала обновления. Таким образом, нагрузка на сервер будет зависеть от количества активных пользователей, а не только от активности чата. Использование Firebase для уведомления об обновлении дает двоякое преимущество:

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

Если подписка Firebase rx.js Observable выдает ошибку или не может подписаться, приложение периодически возвращается к опросу, чтобы убедиться, что чаты по-прежнему обновляются. Аналогичным образом, когда из Firebase поступает обновление, если интервал опроса был запущен ранее, оно отменяется.

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

Первоначально опубликовано на apporchestra.com.