Отстой ли XMPP?
Я должен признаться, что написать эту статью я решил очень спонтанно, прочитав статью «XMPP отстой» и почувствовав некоторую близость к чувствам автора, так как также использую ХМРР в одном из наших продуктов. Тем не менее, сжав эмоции в кулак, я всё-таки решил просто изложить, почему я испытываю смешанные чувства к данному протоколу и разложить по полкам плюсы и минусы. Также расскажу, что мы выбрали для сервера и клиента. Это все, чтобы тебе, дорогой читатель, сделать правильный выбор и вырвать меньше волос в твоих будущих проектах.
Я работаю в компании Thirdlane, где мы делаем продукты для VoIP и унифицированных коммуникаций. В свое время мы выбирали протокол для коммуникаций в одном из наших продуктов. В момент выбора протокола, вопрос стоял просто: писать ли протокол самим, или использовать ХМРР. Других протоколов мы не рассматривали. После не долгих дискуссий мы выбрали ХМРР, полагаясь на то, что это стандартный открытый протокол, имеющий широкое использование, документацию, разные имплементации и расширения, которые на поверхности казались стопроцентно отвечающими нашим требованиям. Сейчас, после достаточно долгого времени роботы с ХМРР, я могу сказать, что я не уверен, что мы сделали правильный выбор. Тем не менее, я не знаю, какими были бы мои чувства, если мы бы пошли другим путем. Конечно сидя вечерами за чашкой чая, я иногда мечтаю вернуться в то время и написать свой закрытый протокол с блек джеком и node.js, но увы. Тут же вспоминаю слова Сократа:
«Женишься ты, или не женишься, ты все равно об этом пожалеешь.»
В момент выбора основные достоинства протокола нам казались следующими:
- Это открытый протокол;
- Существует огромное количество серверов, и клиентов для него;
- Возможность интеграции конечного продукта с внешним миром;
- Он используется в крутых продуктах: MS Lync, Cisco Jabber, Atlassian HipChat, etc..;
- Огромное количество расширений в виде XEP-ов;
- Возможность расширять протокол.
Клиентская сторона
Так как наш продукт ориентирован на веб-браузер, у нас в руках есть только JS, мы его любим, он классный, стильный, и ваще. Если посмотреть на JS-библиотеки для работы с XMPP, то мы увидим несколько поделок типа strophe, xmpp-ftw, JSJaC. Ни одна из них не пришлась мне по душе, в отличие от вышеупомянутой stanza.io, в которую я лично влюбился с первого взгляда. Библиотека очень хорошо продумана и очень чисто написана, поддерживает все жизненно-важные XEP-ы, с ней легко и приятно работать. Единственный ее минус — слабая документация, что частенько требовало чтения исходного кода. Но это было тоже полезно.
Серверная сторона
Тут мы также не долго парились с выбором, так как в Оpenfire на тот момент не было ни Stream Management, ни Web Socket транспорта. Ejabberd также отпал сразу, по причине Erlang. Кроме того, оба продукта, будучи Open Source, имеют тенденцию к коммерциализации, что не есть гуд. В конечном счете мы выбрали Prosody. Шустрый, легкий, написан на красивом языке Lua, отзывчивое комюнити, проект не мертв, каждый XEP — это отдельный модуль, который легко подключать\отключать, возможность легко писать свои модули, ну, в общем, няшка.
Здесь я буду перечислять, только то, что мне кажется важным, и с чем столкнулся лично.
XEP-0115: Entity Capabilities
Это, конечно, большой плюс. Эта штука позволяет нам узнать, какие из XEP-ов реализованы в клиенте нашего собеседника, слать ли ему чат стейт нотификейшнс или нет, ну или еще чего там.
XEP-0280: Message Carbons
Это тоже большой зачет, позволяет синхронизировать сообщения со всеми вашими девайсами, то есть если вы залогинены на ноутбуке, мобильном и десктопе, то это позволит вам держать переписку синхронизированной.
XEP-0308: Last Message Correction
Это просто очень удобно, поправить очепятку в сообщении, которое уже отправлено. Это классно, все пользуются, всем теперь легче, грамарнаци спокойны.
XEP-0184: Message Delivery Receipts
Это просто песня. Вкупе со стрим менеджментом позволяет дать пользователю знать, что сообщение отправлено и что сервер его получил, и позволяет знать, что сообщение доставлено до адресата. Очень полезно, но, к сожалению, эта информация не попадает в историю переписки — «XEP-0313: Message Archive Management».
XEP-0313: Message Archive Management
Это печалька… Данный ХЕР служит для хранения истории и ее получения. В первую очередь вы никогда не узнаете, было ли доставлено какое либо сообщение, если закрыли клиент. Во вторых, получение истории — это указание от какой даты хочешь и какой лимит. Как по мне, так пейджинг был бы здесь уместнее. Также нельзя организовать поиск сообщений по тексту на сервере, что тоже печалит. Но при наличии рук, это, конечно же, решается всякими костылями. Тут я полностью солидарен с автором вышеуказанной статьи. Непонятно, как в протоколе это было упущено.
XEP-0045: Multi-User Chat
Это худшее, что случилось с ХМРР. Это грусть и тоска, боль и страдания, уныние и отчаяние. Я так скажу: число сатаны — это не 666, это 0045. В первую очередь, это не групповые чаты, это имитация IRC. Всё. На этом можно было бы закончить про 0045, но давайте все-таки разберемся, кто виноват и что делать? Знаете, как войти в комнату? Послать запрос, чтобы войти в комнату. Знаете, как создать комнату? Послать запрос, чтобы войти в комнату. Если её не существует, она создастся. Уникальность имени комнаты сервера решают, кто как хочет. Нравится? Велком ту хелл. Тот, кто создавал комнату (ну или кто имеет право), задает количество последних сообщений, которые будут отправлены клиенту, который войдет в комнату. Только вошел, а тебе N сообщений с группы прилетело прямо в морду. Самое ужасное, что 0045 не предусматривает хранения оффлайн участников. А пользователь считается вышедшим из комнаты, как только закроет свой клиент. Для того чтоб вернуться потом в эту комнату, вам нужно или запомнить её имя, или воспользоваться «XEP-0048: Bookmarks». Представьте себе теперь ситуацию: вас пригласили в групповой чат, вы вошли, поговорили и добавили себе эту комнату в букмарки, да еще и указали, чтоб входить в эту комнату каждый раз при логине автоматически. Знаете, что будет, если эту комнату удалили, пока вы были оффлайн? При логине вы прочитаете букмарки и сделаете «вход в комнату», а как мы знаем, что создание не отличается от подключения, то правильно! Вы создадите новую комнату. Еще? У меня для вас будет. Если комнату не указать как «persistent», она будет удалена, как только последний пользователь закроет клиент или выйдет из нее. Вот такие дела, кто виноват — ясно, теперь вопрос: что делать?
Решили мы данную проблему так: все комнаты создаются и конфигурируются, как «member-only», и persistent. В нашем клиенте мы отрисовываем в списке участников всех тех, у кого есть право входить в комнату. Как оказалось, Prosody запрещает получать такой список всем участникам по умолчанию, хотя ХЕР говорит об обратном. Обсудили это с разработчиками Prosody, надеюсь, что договорятся и испрявят. Ну а пока у нас собственное изменение в коде Prosody. Также пришлось сделать изменение, чтобы пользователь мог сам себя исключить из этого списка (да, по умолчанию тоже нельзя), что означает его выход из комнаты. Еще написали кастомный модуль для Prosody, следящий за изменением списка пользователей комнаты (room affiliation) и сообщающий об этом всем участникам. Таким нехитрым способом у нас получились конференции «почти как в скайпе». Интересно, что в XMPP сообществе сейчас обсуждается подобная реализация MUC только используя Pub/Sub, что подтвердил мне один из участников рабочей группы.
XEP-0085: Chat State Notifications
Полезная штука, всегда хорошо знать, печатает ли пользователь или нет, просто приятный ХЕР.
XEP-0198: Stream Management
Это просто из разряда маст-хев. На каждый ваш пук в сторону сервера он будет отвечать, что он это получил, таким образом, вы знаете точно, что сообщение было отправлено для примера. Также позволяет пользоваться протоколом при не стабильном подключении к сети, например, если вы сидите с телефона и у вас иногда пропадает подключение. Это позволит вам возобновлять подключение, а не делать ре-логин.
Вывод
После всего, я все равно затрудняюсь объяснить, почему мои чувства остались негативными. Ведь мы добились, чтобы все работало красиво. Быть может по тому, что мы ожидали, что будем пользоваться протоколом, в котором есть все и не нужно будет тратить время на решение очевидных проблем. Но «втянувшись в бой», мы наткнулись на кучу подводных камней и не продуманных реализаций. Все проблемы, в конце концов, решались, но как в том анекдоте «ложка нашлась, а осадок остался». Еще, наверное, потому, что мы потратил много времени на изучение спецификаций, чтения чужого исходного кода и приведение в порядок ХЕР-ов, которые нам не подходили, да еще, таким образом, чтобы они остались обратно совместимыми с нативными клиентами – что все вместе, есть весьма не благодарное занятие. Но, как я говорил, мы добились требуемого результата. Я думаю, вам самим решать, готовы ли вы изучать сложные спецификации, напарываться на баги их реализаций в клиентах и серверах. Если вы делаете большой сервис, да еще и с интеграциями, то написание собственных расширений вам гарантировано. Посмотрите на тот же HipChat, у него куча кастомных станз. Эти хоть описаны в документации, а что под капотом у Lync или Jabber вообще никому не известно. С другой стороны, если вам нужен базовый функционал, то ХМРР — именно то, что вам надо. Огромное количество всего из коробки, работает 99% случаев.
- Веб-разработка
- Мессенджеры
- JavaScript
- Анализ и проектирование систем
Так ли плох XMPP, как его малюют? Каким Jabber стал сегодня
Причина мифов о XMPP в том, что многим Jabber известен по мессенджерам из далеких двухтысячных годов и плохой осведомленности о особенностях XMPP. С двухтысячных прошло много времени, протокол продолжил существовать и активно развиваться. Современный Jabber уже сильно не похож на тот, который был раньше.
В этой статье мы рассмотрим для чего создавался XMPP, обсудим в комментариях причины снижения его популярности и каким Jabber стал сегодня
Предыстория
В двухтысячных годах у большинства интернет-гигантов были развернуты XMPP сервера. С одного сервера можно было написать на другой и вот уже казалось, если технологию немного доделать появится e-mail 2.0, универсальный мессенджер для всего Интернета, но тут что-то пошло не так. Компании перестали обновлять XMPP-клиенты. Широкого анонса поддержки XMPP не было. Сервера постепенно стали закрывать передачу сообщений на другие, а после вовсе технология была объявлена устаревшей и поддержку свернули.
Для чего создавался XMPP?
XMPP — расширяемый протокол для обмена сообщениями. XMPP создавался как универсальное средство взаимодействия между разными месенджерами. Предполагалось, что крупные компании могут добавить свои расширения и безболезненно интегрировать свои месенджеры и сервера в единую сеть. XMPP не требует полной совместимости, за исключение базового обмена сообщениями и поэтому никто не может всем навязать определенный стек технологий.
XMPP рассматривался как замена e-mail. Даже вид контакта в XMPP внешне похож на e-mail адрес: [email protected] Ожидалось, правительственные учреждения и компании будут использовать Jabber для быстрого развертывания своих приватных систем коммуникаций. Настройки Jabber серверов позволяют ограничивать доступ к серверу и групповым чатам посторонних или наоборот открывать. На XMPP можно создавать закрытые сети из серверов, чем и воспользовалось NSA. По материалам Сноудена, XMPP используется как внутреннее средство связи:
NSA documents obtained by Edward Snowden and reported on by Der Spiegel on Sunday reveal that the agency communicates internally with Jabber, an open source messaging service used by hackers and activists trying to skirt the NSA’s internet surveillance dragnet.
Источник: motherboard.vice.com
Причины падения XMPP
Казалось бы, технология перспективная, но крупные компании быстро потеряли интерес к XMPP. Предполагалось то, что будет работать в идеальном мире, наткнулось на жесткую реальность.
Основной материальный капитал любой крупной интернет-компании — это база пользователей. Многие компании сделали свой бизнес на предоставлении e-mail серверов и закрытых мессенджеров. Если e-mail сервер создать относительно сложно, написать собственный мессенджер еще сложнее, поднять XMPP сервер может любой человек с небольшими познаниями в Linux.
Поддерживать открытый XMPP сервер — это значит дать доступ к клиентской базе множеству мелких конкурентов. Не думаю, что эта ситуация могла понравиться крупным компаниям и инвестирование прекратилось.
«Устаревший и никому ненужный XMPP» как золотая жила! Закрываем S2S, пишем клиенты и зарабатываем миллиарды!
Доподлинно неизвестно, кто использует XMPP в своих продуктах. Некоторые сведения говорят о том, что один из самых популярных мессенджеров — WhatsApp, на старте своего существования использовал (или до сих пор использует) XMPP.
Funny thing is that a couple of year laters in june 2009, Whatsapp team is building its own platform sharing the same vision. Here is a post of Jan Koum on ejabberd mailing list: client access control:
«Hi there,i installed ejabberd today, got it work with adium/ichat and wanted to ask
you all a couple of things» — blog.process-one.net
Причину этого понять легко, потому что «устаревший, избыточный и никому ненужный» XMPP выдерживает 2 000 000 на одной ноде! Если отбросить популизм, в частности речь идет про Ejabberd.
2 000 000 активных соединения. График нагрузки CPU и потребления памяти:
Если Jabber ID заменить на телефонные номера, подписки сопоставить с нахождением номеров в адресной книге, получаем почти полностью готовый продукт с минимумом затрат.
Ejabber поддерживает множество баз данных и соединений с сервером, не только классическим для XMPP способом, но через Websoсket, HTTP запросы и Ejabberd API. На Ejabberd можно создать мессенджер с тысячами онлайн подключений на дешевом VPS, за пару долларов получаем промышленную отказоустойчивость и стабильность работы. Этим выгодно выделяется Ejabberd, по сравнению с множеством других систем обмена сообщениями, падающих от малых нагрузок.
Модифицированные версии XMPP используют многие проприетарные мессенджеры, для быстрого старта с минимумом затрат. Примеров успешного использования ХМPP серверов, как средства для доставки сообщений много. Знаменитая онлайн игра «EVE Online» недавно перевела чаты на Ejabberd. Мессенджер Cryptocat во многом построен на XMPP. Ходят даже слухи, что великий и могущественный Facebook как-то использует XMPP в своих проектах.
Раньше в XMPP была проблема с доставкой сообщений и синхронизацией устройств, как решена она сейчас?
Для доставки сообщений в XMPP используются расширения:
- XEP-0313: Message Archive Management — архив сообщений. Используется для синхронизации при плохом интернет-канале, где периодически недоступно одно устройство.
- XEP-0280: Message Carbons — пересылает сообщения на все онлайн-устройства. Полезен, если отключен архив сообщений в настройках Jabber-клиента.
- XEP-0198: Stream Management — сервер повторно пересылает сообщения, если не получит уведомления о доставке. Полезен, если отключен архив сообщений в настройках Jabber-клиента.
- XEP-0160: Best Practices for Handling Offline Messages — хранение сообщений до доставки. Полезен, если отключен архив сообщений в настройках Jabber-клиента.
- XEP-0333: Chat Markers — Пометка о доставке сообщений.
Раньше в XMPP была проблема с доставкой файлов, как решена она сейчас?
- XEP-0363: HTTP File Upload — файлы загружаются на сервер и передаются как ссылка. Эту ссылку можно отправить любому, даже тому, у кого нет XMPP.
Как дела обстоят с красивыми клиентами в XMPP?
Понятие красоты у всех разное. Некоторые люди в бьются об заклад и говорят что их любимый Gajim, PSI+ и даже Profany самые красивые и самые лучшие, но на Андроид общепризнанный лидер — Conversations.
Ссылка на другие скриншоты и страницу в Play Маркет. Примечание: В настройках Conversations можно включить статус отображения собеседника на кнопке отправки и статус отображения доставки сообщений. Сервер conversations.im, выбираемый по-умолчанию, платный после 6 месяцев использования. Для постоянного использования лучше выбрать другой XMPP сервер, такой как 404.city. Город 404 — это сервер сообщества киберпанков. 404.city официально занимается поддержкой совместимости со всеми версиями Conversations. Ну или поискать сервер здесь.
На Linux большие надежды подает Dino, но пока он еще находится в бете.
Сайт: dino.im. Пакеты для установки: software.opensuse.org
Какие есть особенности у XMPP? Почему у одних все работает отлично, а другие сталкиваются с трудностями?
-
Многое зависит от того, какой сервер и клиент ты используешь. В XMPP децентрализованная разработка. Серверное ПО, клиенты, расширения стандартов зачастую пишут разные группы людей, не взаимодействующие напрямую между собой. За 20 лет существования появилось много клиентов и серверов. Часть из них уже устарела, не обслуживаемая, созданная любителями. Сервера может поднять любой, у кого есть небольшие познания в Linux. Многие не осознают, что Jabber не один мессенджер и сервер. XMPP похож на e-mail, как есть в e-mail хорошие и плохие сервера, так же и в XMPP есть хорошие и плохие сервера. С клиентами все аналогично.
Вывод
XMPP не такой простой и устаревший, каким он кажется. XMPP — это идея объединения всех мессенджеров и сайтов (любой может поднять свой сервер) единым стандартом коммуникации. XMPP — это прекрасный инструмент для создания отказоустойчивых мессенджеров в руках разработчика. Jabber — это неплохая свободная альтернатива WhatsApp и другим мессенджерам, в руках пользователей ознакомленных с особенностями его работы.
XMPP — это тема, которую сложно описать в двух словах. Если Вас заинтересовала моя статья, Вам возможно будут интересны так же эти ссылки:
- Ejabberd — отказоустойчивый сервер
- Prosody — легкий в настройки сервер
- OpenFire — сервер на Java, работает на Windows
- jc.jabber.ru — русское сообщество пользователей XMPP (можно заходить с любого сервера)
- Movim — веб-клиент и заодно социальная сеть на основе XMPP (можно заходить с любого сервера)
Xmpp что это за программа
XMPP is a powerful, open, secure, standards-based protocol. It is a freely-available technology for real-time communication, which powers a wide range of applications including instant messaging, presence, collaboration, voice and video calling, Internet of Things, tactical military messaging, mobile cloud push, and more.
That’s like the chat network? Right?
Right! There is a federated chat network running on XMPP, consisting of thousands of servers owned by enterprises, hosting companies, and individual users.
But XMPP is also well suited to machine-to-machine signalling systems, and other use-cases where internet-wide federation isn’t important. For example, Joachim (one of our members) has developed an internet-of-things system that uses XMPP to control everything from heating systems to multi-coloured lights.
But the two can be combined – the XSF has run demonstrations of controlling light-bulbs over the existing federated chat network.
Who owns XMPP?
XMPP is an open technology, so the simple answer is: no one.
It is not a programming language, or a tool you can download and use. You can’t buy it or pay for a licence to use it.
It is a protocol (a set of standards) that the XMPP Standards Foundation maintains. There is also an active community of open-source and commercial developers who produce a wide variety of XMPP-based software.
In essence, XMPP belongs to the vibrant community that develops and cares for it.
Who uses XMPP?
Google use it for their Google Cloud Messaging. Facebook use it for Facebook Chat integration. NATO use it for tactical chat. Thousands of companies use it for their enterprise instant messaging. Millions of devices use it to interconnect. The IETF use it in their meetings. One of our Board members uses it to talk to his mother.
How can I use XMPP?
If you aren’t already using XMPP (chances are, you are; you just didn’t know it) then you can access all the technical resources you need here.
Anyone can put together their own XMPP service and easily federate with other organisations’ implementations. Because XMPP is an open protocol, implementations can be developed using any software license; although many server, client, and library implementations are distributed as free and open-source software, numerous freeware and commercial software implementations also exist – and they’ll all work together.
Where did XMPP come from?
XMPP is the name for the streaming XML protocol that emerged from the Jabber open source community in 1999. When that community submitted the protocol to the Internet Engineering Task Force (IETF) in 2002, it chose to use the name “XMPP” instead of “Jabber” to eliminate the possibility of confusion with the open source community and the commercial Jabber.com company (since acquired by Cisco Systems, Inc.)
You can read more about the history of XMPP here.
How secure is XMPP?
Security is a moving target, and a vague term. In general terms, XMPP security is substantially better than web security, both from a capability standpoint and the deployed base, and the community is highly active in this area.
XMPP has had its security vetted by the experts at the IETF, and so has native support for pluggable authentication (via SASL) and leading-edge security (via TLS). Moreover, XMPP has been leading the charge on deployment, too – most XMPP client stacks will support SCRAM, for example, and projects like the IM Observatory are pushing the community toward better security. The deployed base of XMPP on the internet is seeing the beginnings of DNSSEC deployment, with some DANE records available.
In terms of end-to-end security, though there has been deployment of OTR and other proprietary extensions, the XMPP community has yet to settle on a particular method. This is in part because of the security benefits of being able to run your own server, which heavily mitigate against the attacks end-to-end cryptography would prevent – remember, XMPP servers talk to each other and your client across heavily encrypted links.
What’s wrong with Skype/WhatsApp/Google Hangouts/whatever? Why should I use XMPP?
If every contact you want to talk to is on Skype already, and you only want to talk to people using whatever facilities Skype offers, then Skype is the one for you.
If you only need to talk to people on mobile handsets who already have WhatsApp, then that’s perfect for you.
Google Hangouts actually still has XMPP under the hood in places, but similar rules apply.
The interesting question is where you need something more. Maybe your contacts all want to run their own server. Maybe you need better security. Maybe you need to exchange arbitrary data. Maybe you’re not happy with one company knowing all your secrets.
How many users are there in the community?
With both an open protocol and a distributed network, that’s almost an impossible question to answer. We know that for the server at jabber.org, there are several thousand servers connected, but there’s no way of telling how many users exist on the network.
What’s the XSF?
The XMPP Standards Foundation is a non-profit organization which acts as a central point for the maintenance of the existing specifications, and the creation of new ones. It’s a membership organization, made of volunteers who help run the standards process.
There’s no need to join to work on the specifications, nor to develop with XMPP, but volunteers willing to help work on how standards are made are always welcome.
При подготовке материала использовались источники:
https://habr.com/ru/articles/261517/
https://habr.com/ru/articles/359084/
https://xmpp.org/about/faq/