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

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

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

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

2) Технологии для обмена данными между клиентом и сервером: например, Firebase Сloud 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 установок) стоимость использования Firestore составит $12.14 в месяц. Для большого приложения (1 млн активных пользователей ежедневно, 10 млн установок) стоимость составит $2951.52 в месяц. Есть пределы, в рамках которых использование Firestore бесплатно.

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

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

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

  • Медленно работает при поиске в оффлайн
    Для Firestore: если количество документов в базе исчисляется сотнями, поиск в оффлайне (по закэшированным документам) может быть медленным и ухудшить UX. Например, если в чате сотня каналов, и надо найти нужный без доступа к интернету — поиск будет работать заметно медленно.
  • От разработчика требуется опыт работы с NoSQL, чтобы построить удобную и эффективную структуру базы данных
    Лимит для Firestore: 1 операция записи в секунду для 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 с дефолтными настройками, и получаем чат c дизайном по умолчанию, а после этого при необходимости кастомизируем те компоненты чата, которые требуется.
  • Автоматически масштабируется
    Вам не придется беспокоиться о ситуации, когда пользователей стало слишком много, и ваш сервер не успевает справляться с запросами. Новые сервера будут создаваться сами. Может поддерживать более 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.
  • Вопросы клиентов
    Технологии