Решения для создания чата: Firebase, SendBird, Node.js + Socket.io — как выбрать? — обложка

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

Все решения для создания чатов можно разделить на 2 типа:

1) Готовые платформы для чатов: например, Firechat, SendBird.

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

2) Технологии для обмена данными между клиентом и сервером: например, Firebase Cloud Messaging, Node.js + Socket.io.

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

Все 4 рассмотренных в статье варианта кросс-платформенные: работают на вебе, iOS и Android.

Firebase Cloud Messaging

Firebase Cloud Messaging — это платформа для обмена информацией между мобильным приложением и сервером. Широко используется для рассылки уведомлений на устройства. На ее основе можно построить чат.

Плюсы:

  • Бесплатный до 100 пользователей одновременно
    Для продуктов, которыми пользуются менее 100 активных пользователей одновременно, использование платформы бесплатно
  • Продукт компании Google
    Это часть платформы Firebase, принадлежащей Google. При правильном использовании можно рассчитывать на стабильную работу без сбоев.
  • Экономия времени и денег на разработку
    Хорошая и подробная документация, а также высокая популярность технологии означают, что разработчик быстро найдёт ответ на любой вопрос. Поэтому он потратит на разработку меньше времени, чем при работе с менее популярной технологией. Соответственно, разработка обойдётся дешевле, если оплата идёт за часы.
  • Можно не покупать сервер
    Простой чат можно сделать без своего сервера. То есть за сервер платить отдельно не нужно. Всё будет работать через сервер Firebase.
  • Автоматическое масштабирование
    При использовании базы данных Firestore серверы автоматически создаются при росте числа пользователей и отключаются, когда они больше не нужны. Вы платите только за реально используемые ресурсы — значительно меньше, чем если бы держали серверы включёнными постоянно. Если используете Node.js и socket.io — масштабирование придётся настраивать вручную.
  • Можно искать информацию в чате без интернета
    Данные по умолчанию сохраняются в кэше и доступны без подключения к интернету.

Минусы:

  • Сложные поисковые запросы реализовывать долго, а некоторые — невозможно
    Например, такой запрос: «найти все сообщения с текстом „Привет“, отправленные пользователю в прошлом году от тех, чьё имя начинается с буквы „А“».
    Дело в том, что при использовании Firebase Cloud Messaging вы ограничены выбором базы данных: либо Firebase Realtime Database, либо Firestore.
    Firebase Realtime Database — это NoSQL-база данных, в которой данные хранятся в формате JSON. У неё есть ряд преимуществ по сравнению с традиционными SQL-базами, но возможности для сложных поисковых запросов ограничены разработчиками — ради производительности.

    Чтобы решить эту проблему, Google создала базу данных Firestore. Она тоже NoSQL, но возможности поиска и структурирования данных в ней значительно лучше. Тем не менее, сложные поисковые запросы по-прежнему гораздо сложнее реализовать, чем в SQL-базах или NoSQL-базах вроде MongoDB. Некоторые из них невозможно выполнить, другие займут намного больше времени на разработку.
  • До 200 000 одновременных пользователей — Firebase Realtime Database, до 1 млн — Firestore
    Пределы масштабирования:
    Для Firebase Realtime Database — ограничение в 200 000 одновременных соединений с базой данных. Это примерно соответствует 200 000 пользователям, которые одновременно используют чат в один и тот же момент. Разработчики Firebase отмечают, что даже у приложений с 10 млн активных пользователей обычно одновременно задействовано не более 200 000.

Для Firestore — максимум 1 млн одновременных подключений.

  • Платный от 100 одновременных пользователей
    Если приложением или сайтом одновременно пользуются более 100 человек — нужно перейти на платный тариф.

При использовании Firestore стоимость использования определяется в основном операциями чтения и записи в базу данных. Чем больше данных хранится в базе — тем выше расходы. Например, по оценкам Firestore, для небольшого приложения (5000 активных пользователей в день, 50 000 установок) стоимость составит $12,14 в месяц. Для крупного приложения (1 млн активных пользователей ежедневно, 10 млн установок) — $2951,52 в месяц. Есть пределы, в рамках которых использование Firestore остаётся бесплатным.

При использовании Firebase Realtime Database стоимость определяется объёмом данных, хранящихся в базе, и скачиваемых из неё — 5 долларов в месяц за каждый гигабайт, хранящийся в базе, и 1 доллар в месяц за каждый скачиваемый гигабайт.

Таким образом, для приложения, которое активно читает и записывает данные в базу, выгоднее использовать Firebase Realtime Database, а не Firestore. Иногда оптимально хранить одни данные в Firestore, а другие — в Firebase Realtime Database. Например, в типичном интернет-магазине при каждом открытии приложения происходит чтение каталога товаров, и количество таких операций быстро растёт с числом пользователей. При этом объём каталога, скорее всего, не зависит от количества пользователей. В таком случае разумно хранить каталог в Firebase Realtime Database (чтобы не платить за большое число операций чтения), а данные пользователей — в Firestore (поскольку хранение 1 ГБ там обходится дешевле) (источник).

Использование самой платформы Firebase Cloud Messaging бесплатно — платить нужно только за базу данных, хостинг и аутентификацию.

  • Медленно работает при поиске в оффлайн
    Для Firestore: если в базе хранится несколько сотен документов, поиск в оффлайне (по закэшированным данным) может сильно замедляться и ухудшать пользовательский опыт. Например, если в чате есть около ста каналов, и нужно найти нужный без интернета — поиск будет работать заметно медленнее.
  • От разработчика требуется опыт работы с NoSQL, чтобы построить удобную и эффективную структуру базы данных
    Лимит для Firestore — 1 операция записи в секунду на один документ. Документ — это структурная единица базы данных Firestore. База данных Firestore состоит из документов, которые группируются в коллекции. Документ представляет собой набор пар «ключ-значение». На практике это ограничение гибкое: если выполнить 10 операций записи одновременно, Firestore обработает их без проблем. Однако если постоянно отправлять тысячи запросов на запись с частотой выше 1 в секунду, Firestore начнёт возвращать ошибки для части этих запросов.

Firechat

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

Плюсы:

  • Экономия времени и денег на разработку
    Готовое API для основных функций чата позволяет не изобретать велосипед — эти функции уже реализованы.
  • Те же преимущества, что и у Firebase Cloud Messaging

Минусы:

  • Получится сделать не все функции
    Используя готовое API для чата, можно реализовать только тот функционал, который оно поддерживает. Например, не отображаются непрочитанные сообщения, нет возможности удалять сообщения, а в группе чата может быть не более 100 пользователей. Полный список функций найти непросто, но по набору методов API можно составить представление о возможностях — здесь.
  • Те же минусы, что и у Firebase Cloud Messaging с Firebase Realtime Database
    В Firechat из коробки используется только Firebase Realtime Database. Выбор базы данных, как в Firebase Cloud Messaging — между Firebase Realtime Database и Firestore, — отсутствует.

SendBird

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

Плюсы:

  • Много функций
    Множество функций уже реализовано и работает «из коробки»: обмен сообщениями и файлами, приглашения, блокировка пользователей, индикация набора текста, редактирование сообщений, автоматический перевод, панель администратора, групповые чаты до 100 участников.
  • Есть готовый UI с ограниченными возможностями кастомизации
    Не обязательно разрабатывать интерфейс и его дизайн с нуля. В комплекте уже есть стандартные варианты интерфейса — можно использовать их как есть. Поверх базового дизайна можно добавить свой — изменить цвет и форму элементов чата. Схема подключения SendBird может выглядеть так: добавляем в продукт SendBird с настройками по умолчанию и получаем чат со стандартным дизайном, а затем при необходимости настраиваем те элементы, которые нужно изменить.
  • Автоматически масштабируется
    Вам не придётся беспокоиться о ситуации, когда пользователей станет слишком много, и сервер не справится с нагрузкой. Новые серверы будут создаваться автоматически. Система может поддерживать более 1 млн пользователей, одновременно использующих чат. Работает на AWS.

Минусы:

  • Не все функции можно реализовать
    Структура чата и поведение функционала строго заданы. Пользователь заходит в аккаунт и получает доступ к списку каналов. Он может выбрать существующий канал или создать новый. Каналы бывают двух видов: публичные (доступны всем пользователям) и приватные (только для определённого круга пользователей). Через каждый канал пользователь может отправлять и получать сообщения.
    Это стандартная структура, характерная для большинства чатов. Но если вашему продукту нужна более необычная логика, реализовать её через SendBird будет сложно. Некоторые функции невозможно реализовать вообще, другие займут больше времени, чем при разработке с нуля — например, на Node.js и Socket.IO. Так, треды для ответов на сообщения в канале, как в Slack, создать не получится.
  • Не все доступные функции можно реализовать так, как хочется
    Возможности настройки SendBird шире, чем может показаться на первый взгляд (хотя и скрыты в глубине документации). Но есть заметные ограничения. Например, SendBird позволяет хранить дополнительную информацию о каждом пользователе, но не более 5 параметров. Это, к примеру, имя, фамилия, город, пол, вес, цвет глаз… То есть для приложений знакомств это неудобно — обычно им нужно хранить гораздо больше данных. В таком случае хранить и синхронизировать эту информацию придётся вне SendBird.
  • Не так популярен, как решения на Firebase и Socket.io
    Популярность — важная метрика при выборе фреймворка. Чем популярнее фреймворк, тем больше сообщество разработчиков, использующих его. Это значит, что новичкам проще и быстрее находить нужные ресурсы, поддержку и ответы на вопросы при реализации тех или иных задач. При прочих равных условиях популярная технология позволяет быстрее разрабатывать продукт. А если вы платите за время работы — это также делает разработку дешевле.
  • Цена
    - зависит от числа пользователей. Базовый пакет стоит $400 в месяц для 5000 активных пользователей в месяц. При 100 000 активных пользователей в месяц цена составит уже $5000 в месяц. Или $7600, если понадобится перевод сообщений на другие языки и «продвинутая модерация». Есть бесплатный пробный период — 30 дней. Для продуктов с более чем 100 000 активных пользователей в месяц цена рассчитывается индивидуально.

Node.js + Socket.io

Серверная платформа Node.js вместе с библиотекой для обмена данными в реальном времени Socket.io позволяет создать чат с практически неограниченными возможностями настройки.

Плюсы:

  • Позволяет реализовать любой функционал
    У разработчика есть полный контроль над всеми компонентами: интерфейс, логика, данные и серверные эндпоинты могут быть любыми — как нужно. Например, можно организовать треды для ответов на отдельные сообщения, чего не поддерживает SendBird. Также можно добавить удаление сообщений — такой функции нет в Firechat.
  • Масштабируется
    Можно настроить автоматическое масштабирование в зависимости от нагрузки — как на AWS, так и на других готовых платформах, например Oracle. Но масштабирование не работает «из коробки» — его нужно разрабатывать программисту.
  • Можно выбрать тот вид базы данных, который лучше всего подойдёт именно вашему продукту
    Например, если в будущем продукте планируется реализовать много сложных поисковых запросов, стоит выбрать SQL-базу данных (вместо Firestore или Firebase Realtime Database, где такие запросы не поддерживаются).
  • Чат быстро работает
    Сообщения передаются напрямую между сервером и клиентом, что обеспечивает высокую скорость. При использовании Firebase Cloud Messaging сообщение сначала идёт с вашего сервера на сервер Firebase, а затем — на устройство. Но, честно говоря, даже задержка в полсекунды для текстового чата почти не ощущается. Скорее всего, пользователь разницы не заметит.
  • Бесплатно
    Открытое и бесплатное решение — вы не платите ежемесячно за использование технологии.
    Обратите внимание: придётся оплачивать аренду сервера, на котором будет работать ваш продукт. Но стоимость сервера обычно значительно ниже, чем плата за Firebase Cloud Messaging или Firechat.
    Как рассчитать расходы на сервер — расскажем в отдельной статье.

Минусы:

  • Требует больше времени и денег на реализацию
    Программист разрабатывает каждую функцию с нуля.
  • Не каждый сможет разработать
    Нужен квалифицированный программист с опытом создания чатов на Node.js и Socket.IO.

Суммируя

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

На Node.js и socket.io можно создать любой чат, но каждую функцию программисту придётся писать с нуля. Это требует времени и денег.

Что выбрать?

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

  • Если чату нужен минимальный базовый функционал, к нему нет высоких требований и не ожидается много пользователей одновременно, то Firechat или решение на основе Firebase Cloud Messaging вполне подойдут.
  • В том случае, если от чата требуются более продвинутые возможности, имеет смысл рассмотреть платформу для чатов SendBird. Здесь стоит сравнить стоимость разработки чата с нуля на Node.js и Socket.io с ежемесячными платежами за SendBird.
  • Если к чату предъявляются высокие требования или нужны особые настройки, лучше всего подойдёт собственное решение на основе Node.js и Socket.io.
  • Вопросы клиентов
    Технологии