XMPP vs WebSockets: что использовать для приложения чата
Если вы планируете разработать приложение для коммуникации в реальном времени, например чат, следует тщательно выбирать технологии. В этой статье Анастасия Иванова, технический писатель платформы МТС Exolve (входит в экосистему МТС), сравнивает два популярных инструмента — протоколы WebSockets и XMPP — и определяет, какой из них подходит под конкретные задачи.
Что такое протокол XMPP
XMPP (Extensible Messaging and Presence Protocol, или Jabber) — протокол обмена сообщениями в реальном времени с открытым исходным кодом. Его создал программист Джереми Миллер в конце 90-х как альтернативу закрытым программам для обмена сообщениями. Недавно технологию стандартизировала инженерная группа интернета (IETF), а само решение быстро стало популярным среди разработчиков чат-приложений.
XMPP назначает каждому клиенту в сети XMPP-адрес (JabberID) для идентификации — так же, как стандартный email с IP-адресом или доменным именем.
Интересно, что XMPP описывает формат и поведение связи, но нестрого определяет «транспорт», который отправляет сообщения по сети. По умолчанию XMPP использует TCP (протокол управления передачей) для обмена данными XML (расширяемый язык разметки) между конечными точками сети. Однако некоторые корпоративные брандмауэры блокируют обмен данных при использовании TCP. Чтобы решить проблему, сообщество XMPP разработало HTTP-транспорт Bosh: его можно использовать в качестве запасного варианта, а также для установления стабильных соединений через HTTP, обеспечивая асинхронную связь между клиентами и серверами XMPP.
XMPP также не поддерживает передачу двоичных данных, он работает только с текстовыми — в формате XML. Синтаксис XML многословен и избыточен по сравнению с другими текстовыми форматами обмена данных (например, JSON).
Однако XMPP завоевал популярность, потому что легко масштабируем и в нём много плагинов:
расширение для поддержки асинхронного обмена сообщениями
система публикации или подписки
сигнализация для VoIP
видео, передача файлов, игры
приложения интернета вещей (IoT), включая интеллектуальную сеть и службы социальных сетей
XMPP-архитектура
XMPP использует архитектуру «клиент — сервер». Сообщения маршрутизируются между пользователями через серверы, а не напрямую. XMPP применяет концепцию децентрализации, при которой процесс разработки происходит не на одном программном компоненте. Вы можете создавать собственные серверы для обработки маршрутизации сообщений, а пользователи — для хранения данных.
В архитектуру XMPP также входят шлюзы: они расположены между серверами XMPP и теми, которые обрабатывают другие протоколы (например, SMS и SMTP), и обеспечивают возможность трансляции. Значит, вы можете разрабатывать сервисы для общения людей между собой при помощи различных каналов — SMS (хотя тут мы, конечно, выступаем за SMS API без заморочек), электронной почты, XMPP и других.
Схема XMPP-архитектуры
Открытый архитектурный стиль вносит значительный вклад в гибкость и масштабируемость XMPP, при этом контроль над системой легко разделить между несколькими владельцами.
Безопасность XMPP
Основные спецификации XMPP предусматривают несколько уровней безопасности:
простой уровень аутентификации и безопасности (SASL) для аутентификации безопасного соединения и защиты данных в интернет-протоколах
шифрование «точка — точка» (TLS) и многоканальное шифрование (OMEMO) для безопасной передачи данных
Надёжная защита информации делает XMPP удобным решением для разработчиков, ведь функции безопасности уже реализованы и бесплатны.
Есть множество библиотек для создания платформ XMPP на разных языках программирования: С#, .NET, Python, Java (включая Android), C++, Swift, Rust и др. Подробный список можно найти на XMPP Libraries & Tools.
Преимущества и недостатки XMPP
Преимущества:
XMPP — протокол с поддержкой внушительного сообщества
имеет множество доступных расширений, а значит не нужно реализовывать их самостоятельно
высокий уровень безопасности, доступный «из коробки» (хотя, конечно, про высокую защиту лучше рассуждать в контексте Messaging API от МТС Exolve или готовых продуктов, нежели на уровне протокола)
совместимость с другими форматами обмена сообщениями через шлюзы XMPP (SMS, SMTP и т. д.)
децентрализованная архитектура XMPP позволит создавать несколько управляющих серверов
функциональность — есть готовые решения для обмена сообщениями
Недостатки:
нет поддержки передачи двоичных данных, что может быть серьёзным ограничением. Внутри XML, который менее эффективно использует память по сравнению с облегчёнными JSON и MessagePack
доставка сообщений происходит медленнее, чем у WebSockets, а соединения XMPP нестабильны. Это существенно снижает пропускную способность
некоторые корпоративные брандмауэры блокируют такую передачу сообщений. Чтобы решить проблему, сообщество XMPP разработало HTTP-транспорт
нет гарантий обмена сообщениями: сейчас XMPP не поддерживает QoS
Что такое протокол WebSocket
WebSocket — тонкий транспортный уровень. Он построен поверх стека TCP/IP, который обеспечивает управляемые событиями соединения с малой задержкой между сервером и браузером. Протокол WebSocket опубликовали IETF в 2011 году, и сегодня с ним работают такие популярные приложения, как Trello, Slack и Discord.
Технология поддерживает передачу и текстовых, и двоичных данных. Здесь нет жёстких ограничений на одновременные соединения — это зависит только от возможностей используемой системы. А значит, масштабируемость станет проще, чем при работе с XMPP.
Передача сообщений через WebSocket происходит намного быстрее, в его арсенале огромное количество доступных библиотек и расширений. Есть проблемы с некоторыми корпоративными брандмауэрами, блокирующими передачу сообщений, поэтому иногда требуется откат HTTP.
Архитектура WebSocket
WebSocket использует централизованную клиент-серверную архитектуру. Сообщения передаются между клиентами через серверы, а не напрямую. Обычно для каждого приложения существует единая система управления для обработки маршрутизации данных. Клиенты подключаются к ней, указывая конечную точку URL-адреса сервера.
Одно соединение WebSocket может обрабатывать все сообщения для одного сеанса и сохраняется до закрытия.
Функции идентификации и аутентификации в WebSocket платные, придётся добавлять их самостоятельно. Протокол поддерживает следующие языки и библиотеки:
JavaScript (socket.IO, SockJS)
NET (SignalR)
Java (ServerSocket, Jetty)
Python (websocket-client) и другие
WebSocket API для подключения к серверам WebSocket работает во всех основных браузерах (см. таблицу поддержки браузеров WebSockets). Также доступны клиенты для Windows, macOS, Linux, Android, iOS.
Преимущества и недостатки WebSocket
Преимущества:
скорость: одно соединение WebSocket обрабатывает все сообщения для одного сеанса, соединение постоянное, а скорость передачи выше, чем у XMPP
WebSocket передаёт двоичные данные и UTF-8; приложения поддерживают отправку простого текста и двоичных форматов, таких как изображения и видео
поддержка целостности данных: предоставляется гарантия доставки сообщений
ограничений на количество одновременных подключений между клиентом и сервером гораздо меньше, чем у XMPP
Недостатки:
некоторые корпоративные брандмауэры с проверкой пакетов проблематично работают с WebSocket (особенно SophosXG Firewall, WatchGuard и McAfee Web Gateway)
нет встроенной поддержки повторного подключения: когда соединение WebSocket закрыто (например, из-за проблем с сетью), клиент не пытается повторно подключиться к серверу. То есть потребуется написать дополнительный код для опроса сервера, повторного подключения и установления соединения при появлении возможности. В качестве альтернативы можно использовать библиотеку с поддержкой переподключения, например Socket.IO
не настолько масштабируемый, как XMPP
WebSocket не такой безопасный, как XMPP. Нужны решения для функции аутентификации, самостоятельные или из дополнительной библиотеки
по умолчанию в протоколе меньше функций обмена сообщениями, чем в XMPP
не так развит, как XMPP, хотя имеет лучшую поддержку на веб-платформе (например, встроенная поддержка браузера)
WebSocket не так открыт, как XMPP, что может стать проблемой для определённых решений
Что лучше: XMPP или WebSocket
И XMPP, и WebSockets — рабочие инструменты для создания чат-приложений. Выбор протокола зависит от нескольких ключевых факторов.
XMPP — более зрелая технология с открытым кодом и множеством доступных расширений и библиотек, но она не поддерживает передачу двоичных данных. Решение лучше адаптировали для чатов, оно по умолчанию поставляется с несколькими встроенными уровнями безопасности.
WebSockets новее, имеет качественную поддержку браузеров, мощный набор доступных библиотек для облегчения функций чата (например, Socket.IO) и превосходит XMPP в скорости и производительности. Протокол быстрее передаёт большие объёмы данных с постоянными подключениями.
Есть бесчисленное множество веб-сайтов и приложений с применением XMPP, WebSocket или даже двух протоколов. Если интересно, ниже приведён список.
Приложения, использующие XMPP:
WhatsApp использует собственную версию XMPP
Apple использует XMPP для доставки push-уведомлений
Grindr, приложение для знакомств на основе геолокации, использует XMPP для функций чата
Веб-приложения, использующие WebSocket:
Trello, приложение для совместного управления задачами, использует WebSocket
Slack использует WebSocket на порту 443
Discord, популярная платформа игрового чата, также использует WebSocket
И XMPP, и WebSocket внедрили в Zoom. Он использует XMPP для чата и WebSocket в качестве транспортного протокола.
Если необходимо отправлять туда и обратно несколько типов данных, особенно двоичные, то выбирайте WebSocket. Если нужно открыть несколько подключений для каждого пользователя, опять же лучше WebSocket. В скорости он также выигрывает.
Если у вас серьёзные опасения по поводу безопасности, то попробуйте XMPP. Он же понадобится, если нужно побольше встроенных функций и необходима экосистема плагинов для расширения возможностей.
Но нужно понимать, что с практической точки зрения меньше ресурсов отнимает работа с готовыми API вроде Messaging API. Особенно, если в итоге придётся соединять разные каналы в один агрегат и думать про защиту данных. Просчитать логику работы одной системы с разными протоколами — та ещё задачка.
Что в итоге?
И XMPP, и WebSockets — работающие решения для создания чат-приложений. Выбор технологии зависит от нескольких ключевых факторов.
XMPP — более зрелая технология с открытым кодом, множеством доступных расширений и библиотек, но она не поддерживает передачу двоичных данных. Инструмент адаптирован для чат-приложений и по умолчанию поставляется с несколькими встроенными уровнями безопасности.
WebSockets новее, имеет качественную поддержку браузеров, мощный набор доступных библиотек для облегчения функций чата и превосходит XMPP в скорости и производительности. Он быстрее передаёт большие объёмы данных с постоянными подключениями.
Исходя из всего вышеперечисленного, можно сделать вывод:
выбирайте XMPP, если хотите масштабируемости, гибкости и безопасности
выбирайте WebSockets, когда нужны скорость, производительность, высокий параллелизм и целостность данных (заказ и гарантированная доставка)