Какая архитектура лучше всего подходит для подключения к XMPP?

StackOverflow https://stackoverflow.com/questions/35677

  •  09-06-2019
  •  | 
  •  

Вопрос

Если у меня есть отдельная система со своей собственной концепцией пользователей и присутствия, какая архитектура является наиболее подходящей для создания моста к сети XMPP-серверов?Насколько я могу судить, есть три основных способа:

  1. Действуйте как сервер.Это создает одну точку соприкосновения, но я боюсь, что это имеет последствия для совместимости и потенциально создает сложности в моей системе для эмуляции сервера.

  2. Действуйте как клиент.Похоже, это подразумевает, что мне нужно одно соединение для каждого пользователя в моей системе, которое просто не будет хорошо масштабироваться.

  3. Я слышал о протоколе 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 регистрироваться и так далее.

Если вы их еще не видели, возможно, они покажутся вам полезными:

Надеюсь, это поможет.

Другие советы

Я тоже работаю над аналогичной системой.

Я использую маршрут шлюз / компонент.Я рассмотрел несколько вариантов и остановился на этом.

Шлюз - это, по сути, компонент, предназначенный для соединения 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.

  1. Используете ли вы систему, отличную от XMPP?Если да, вам следует найти способ добавить интерфейс XMPP-S2S к этой системе, другими словами, заставить ее действовать как XMPP-сервер.AOL использует этот подход для достижения цели.К сожалению, они ограничили свой доступ к GoogleTalk.

  2. Вы не используете систему, отличную от XMPP, но у нее есть интерфейс федерации, который вы можете использовать - i.e.ваш шлюз может взаимодействовать с другой системой в качестве сервера и имеет собственное пространство имен.В этом случае вы можете создать шлюз, который действует как федеративный сервер с обеих сторон.Ибо я не знаю ни одного примера шлюза, который использует этот подход, но вы могли бы использовать его, если хотите построить общедоступный мост XMPP-to-SIP.

  3. Если система, отличная от XMPP, не предоставляет вам интерфейс федерации, то у вас нет другого выбора, кроме как действовать как группа клиентов.В мире XMPP это называется "транспортировкой".Различия между транспортным и обычным сервером в основном заключаются:

    • идентификаторы JID транспорта отображаются из другой системы (например,john.doe\40example.net@msngateway.example.org - действительно уродливый!)
    • Пользователям XMPP, которые хотят использовать транспорт, необходимо создать учетную запись в системе, отличной от XMPP, и предоставить службе транспорта учетные данные для входа в эту учетную запись.Протокол XMPP даже имеет расширение протокола, которое позволяет пользователям XMPP выполнять регистрацию транспорта внутри диапазона.

Еще один подход - работать с поставщиком вашего сервера XMPP. Большинство из них имеют внутренние API-интерфейсы, которые делают возможным присутствие присутствия из сторонних приложений. Например, Jabber XCP предоставляет API для этого, который действительно прост в использовании.

(Раскрытие информации: я работаю в Jabber, Inc, компании, стоящей за Jabber XCP)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top