Какая архитектура лучше всего подходит для подключения к XMPP?
-
09-06-2019 - |
Вопрос
Если у меня есть отдельная система со своей собственной концепцией пользователей и присутствия, какая архитектура является наиболее подходящей для создания моста к сети XMPP-серверов?Насколько я могу судить, есть три основных способа:
Действуйте как сервер.Это создает одну точку соприкосновения, но я боюсь, что это имеет последствия для совместимости и потенциально создает сложности в моей системе для эмуляции сервера.
Действуйте как клиент.Похоже, это подразумевает, что мне нужно одно соединение для каждого пользователя в моей системе, которое просто не будет хорошо масштабироваться.
Я слышал о протоколе XMPP gateway, но неясно, лучше ли это клиентского решения.Я также не могу сказать, является ли это стандартным или нет.
Будем признательны за любые предложения или компромиссы.Например, потребует ли какое-либо из этих решений запуска кода внутри целевого XMPP-сервера (вряд ли я что-то смогу сделать).
Решение
Протокол XMPP gateway, о котором вы слышали, скорее всего, связан с транспортировками.Транспорт - это сервер, который подключается как к XMPP-серверу, так и к серверу, отличному от XMPP.Запустив транспорт, я могу использовать свой Jabber-клиент для общения с кем-либо, использующим, скажем, MSN Messenger.
Транспорт обычно подключается один раз к удаленной сети для каждого JID, который он видит как подключенный к сети.То есть, это ваш вариант 2 в обратном порядке.Это связано с тем, что между транспортом и сетью, отличной от XMPP, нет особой взаимосвязи;транспорт просто действует как группа постоянных клиентов.Чтобы это сработало, клиенты XMPP должны сначала зарегистрироваться в транспорте, предоставив учетные данные для входа в удаленную сеть и разрешив транспорту просматривать их присутствие.
Единственная причина, по которой у этого есть шанс на лучшее масштабирование, заключается в том, что для одной и той же удаленной сети может быть много транспортных потоков.Например, мой Jabber-сервер может запускать передачу в MSN, другой Jabber-сервер может запускать другой и так далее, каждый из которых обеспечивает подключения для другого подмножества пользователей XMPP.Хотя это распределяет нагрузку на стороне Jabber, и балансировка нагрузки в вашей системе также может распределить нагрузку, это по-прежнему требует большого количества подключений между двумя системами.
В вашем случае, поскольку (я предполагаю) взаимодействует сторона, не связанная с XMPP, размещение интерфейса XMPP-сервера на сервере, отличном от XMPP, вероятно, ваш лучший выбор.Этот серверный интерфейс лучше всего подходит для управления сопоставлением между JID XMPP и тем, как этот JID будет отображаться в его собственной сети, вместо того, чтобы заставлять пользователей XMPP регистрироваться и так далее.
Если вы их еще не видели, возможно, они покажутся вам полезными:
- http://www.jabber.org/jabber-for-geeks/technology-overview
- http://www.xmpp.org/protocols/
- http://www.xmpp.org/extensions/
Надеюсь, это поможет.
Другие советы
Я тоже работаю над аналогичной системой.
Я использую маршрут шлюз / компонент.Я рассмотрел несколько вариантов и остановился на этом.
Шлюз - это, по сути, компонент, предназначенный для соединения Jabber / XMPP с другой сетью.Вам придется создавать большинство вещей, которые вы считаете само собой разумеющимися при использовании XMPP в качестве клиента.Такие вещи, как контроль состава участников.
В Интернете очень мало информации о фактическом проектировании и сборке компонента.Как и в приведенном выше ответе, я обнаружил, что протоколы / расширения xmpp могут помочь.Основными из них являются:
Ознакомившись с ними, вы увидите, с какими XEPS вы, как ожидается, сможете справиться.Игнорируйте данные, которые будут обрабатываться сервером, к которому будет подключен ваш компонент.
Жаль, что у Djabberd такая плохая документация, поскольку их система "everything is a module" давала возможность серверной части сервера напрямую взаимодействовать с другой сетью.Я не продвинулся в этом вопросе.
Существует два типа соединений между серверами (s2s). Первый называется шлюзом или транспортом, но это одно и то же. Это, вероятно, тот, который вы ищете. Я не смог найти конкретную документацию для сторон не-XMPP, но то, как XMPP думает о переводе на устаревшие серверы, находится по адресу http://xmpp.org/extensions/xep-0100.html . Второй тип действительно не объясняется ни в каких дополнительных XEP - это обычные XMPP-соединения s2s. Ищите «Связь между серверами» " в RFC 3920 или RFC 3920bis для последнего чернового обновления.
Поскольку у вас есть собственные пользователи и ваше присутствие на вашем сервере, а это не XMPP, концепции не будут полностью сопоставлены с моделью XMPP. Вот тут и начинается работа транспорта. Вы должны выполнить перевод из вашей модели в модель XMPP. Пока это какая-то работа, вы все равно принимаете все решения. Р>
Что дает нам право на один из ключевых вариантов дизайна - вам нужно действительно решить, какие вещи вы собираетесь отобразить в XMPP из своего сервиса, а какие нет. Эти функции и описания вариантов использования будут определять общую структуру. Например, это как транспорт для общения со службами чата AOL или MSN? Затем вам потребуется способ сопоставить их списки, сведения о присутствии и хранить информацию о сеансе, а также логины и пароли от локальных пользователей на удаленном сервере. Это потому, что ваш транспорт должен притворяться этими пользователями и должен будет войти в систему для них.
Или, может быть, вы просто мост s2s для чужой шахматной игры на основе XMPP, поэтому вам не требуется вход на удаленный сервер, и вы можете просто действовать аналогично серверу электронной почты и передавать информацию туда и обратно , (При обычных соединениях s2s единственным сеансом, который будет сохранен, будет аутентификация SASL, используемая с удаленным сервером, но на уровне пользователя s2s просто поддерживает соединение, а не сеанс входа в систему.)
Другими факторами являются масштабируемость и модульность с вашей стороны. Вы добились некоторых проблем с масштабируемостью. Взгляните на использование нескольких транспортных средств, чтобы сбалансировать нагрузку. Для модульности посмотрите, где вы хотите принять решение о том, что делать с каждым пакетом или действием. Например, как вы обрабатываете и отслеживаете данные подписки? Вы можете поместить его в свой транспорт, но тогда это усложнит использование нескольких транспортов. Или, если вы примете это решение ближе к вашему главному серверу, вы можете использовать более простые транспорты и использовать некоторый общий код, если вам нужно общаться с сервисами, отличными от XMPP. Компромисс - более сложный главный сервер с большей вероятностью уязвимости.
Какую архитектуру вы должны использовать, зависит от системы, отличной от XMPP.
Используете ли вы систему, отличную от XMPP?Если да, вам следует найти способ добавить интерфейс XMPP-S2S к этой системе, другими словами, заставить ее действовать как XMPP-сервер.AOL использует этот подход для достижения цели.К сожалению, они ограничили свой доступ к GoogleTalk.
Вы не используете систему, отличную от XMPP, но у нее есть интерфейс федерации, который вы можете использовать - i.e.ваш шлюз может взаимодействовать с другой системой в качестве сервера и имеет собственное пространство имен.В этом случае вы можете создать шлюз, который действует как федеративный сервер с обеих сторон.Ибо я не знаю ни одного примера шлюза, который использует этот подход, но вы могли бы использовать его, если хотите построить общедоступный мост XMPP-to-SIP.
Если система, отличная от XMPP, не предоставляет вам интерфейс федерации, то у вас нет другого выбора, кроме как действовать как группа клиентов.В мире XMPP это называется "транспортировкой".Различия между транспортным и обычным сервером в основном заключаются:
- идентификаторы JID транспорта отображаются из другой системы (например,john.doe\40example.net@msngateway.example.org - действительно уродливый!)
- Пользователям XMPP, которые хотят использовать транспорт, необходимо создать учетную запись в системе, отличной от XMPP, и предоставить службе транспорта учетные данные для входа в эту учетную запись.Протокол XMPP даже имеет расширение протокола, которое позволяет пользователям XMPP выполнять регистрацию транспорта внутри диапазона.
Еще один подход - работать с поставщиком вашего сервера XMPP. Большинство из них имеют внутренние API-интерфейсы, которые делают возможным присутствие присутствия из сторонних приложений. Например, Jabber XCP предоставляет API для этого, который действительно прост в использовании.
(Раскрытие информации: я работаю в Jabber, Inc, компании, стоящей за Jabber XCP)