9

如果我有一个单独的系统,它有自己的用户和存在概念,那么创建到 XMPP 服务器网络的桥接的最合适的架构是什么?据我所知,主要有以下三种方式:

  1. 充当服务器。这会创建一个接触点,但我担心它会对兼容性产生影响,并且可能会在我的系统中增加用于模拟服务器的复杂性。

  2. 充当客户。这似乎意味着我的系统中的每个用户都需要一个连接,而这并不能很好地扩展。

  3. 我听说过 XMPP 网关协议,但不清楚这是否比客户端解决方案更好。我也无法判断这是否是标准的。

任何建议或权衡将不胜感激。例如,这些解决方案中的任何一个是否都需要在目标 XMPP 服务器内运行代码(这不太可能是我能做的)。

4

5 回答 5

4

您听说过的 XMPP 网关协议很可能与传输有关。传输是连接到 XMPP 服务器和非 XMPP 服务器的服务器。通过运行传输,我可以使用我的 Jabber 客户端与使用 MSN Messenger 的人交谈。

对于它认为在线的每个 JID,传输通常会连接到远程网络一次。也就是说,这是您的选项 2 反过来。这是因为传输和非XMPP网络之间没有特殊关系;运输只是充当一群普通客户。为此,XMPP 客户端必须首先向传输注册,提供远程网络的登录凭据,并允许传输查看他们的存在。

这有可能更好地扩展的唯一原因是同一个远程网络可以有许多传输。例如,我的 Jabber 服务器可以运行到 MSN 的传输,另一个 Jabber 服务器可以运行另一个,依此类推,每一个都为不同的 XMPP 用户子集提供连接。虽然这分散了 Jabber 端的负载,并且系统上的负载平衡也可能分散负载,但它仍然需要两个系统之间的许多连接。

在您的情况下,因为(我假设)事物的非 XMPP 方面正在合作,所以在非 XMPP 服务器上放置 XMPP 服务器接口可能是您最好的选择。该服务器接口最适合管理 XMPP JID 之间的映射以及该 JID 如何出现在其自己的网络上,而不是强制 XMPP 用户注册等等。

如果您还没有看到这些,您可能会发现它们很有用:

希望有帮助。

于 2008-08-30T17:59:05.407 回答
2

我也在研究类似的系统。

我将使用网关/组件路由。我已经查看了几个选项并选择了这个。

网关基本上是一个组件,其特定目的是将 Jabber/XMPP 与另一个网络桥接。将 XMPP 用作客户端时,您将不得不构建您认为理所当然的大部分内容。名册控制之类的东西。

关于组件的实际设计和构建,在线帮助很少。像上面的答案一样,我发现 xmpp 协议/扩展是有帮助的。主要的有:

通读这些将向您展示您将能够处理哪些 XEP。忽略将由您的组件附加到的服务器处理的内容。

令人遗憾的是,Djabberd 的文档如此糟糕,因为他们的“一切都是模块”系统使服务器的后端可以直接连接到其他网络。我在这方面没有任何进展。

于 2008-09-11T21:36:46.310 回答
2

基本上有两种类型的服务器到服务器 (s2s) 连接。第一个被称为网关或传输,但它们是相同的。这可能是您正在寻找的那种。我找不到非 XMPP 方面的特定文档,但 XMPP 如何考虑对遗留服务器进行翻译位于http://xmpp.org/extensions/xep-0100.html。第二种确实没有在任何其他 XEP 中解释——它是常规的 XMPP s2s 连接。在 RFC 3920 或 RFC 3920bis 中查找“服务器到服务器通信”以获取最新的草稿更新。

由于您在服务器上有自己的用户和存在,而且它不是 XMPP,因此这些概念不会完全映射到 XMPP 模型。这就是传输工作的用武之地。您必须将模型从模型转换为 XMPP 模型。虽然这是一些工作,但您确实可以做出所有决定。

这给我们带来了关键的设计选择之一——您需要真正决定将哪些内容从您的服务映射到 XMPP,哪些不映射。这些功能和用例描述将推动整体结构。例如,这是否类似于与 AOL 或 MSN 聊天服务交谈的传输?然后,您需要一种方法来将他们的名册、状态和保留会话信息以及本地用户的登录名和密码映射到远程服务器。这是因为您的传输需要伪装成这些用户,并且需要为他们登录。

或者,也许您只是连接到其他基于 XMPP 的国际象棋游戏的 s2s 桥梁,因此您不需要在远程服务器上登录,并且可以像电子邮件服务器一样操作并来回传递信息。(对于正常的 s2s 连接,唯一会存储的会话是与远程服务器一起使用的 SASL 身份验证,但在用户级别,s2s 只维护连接,而不是登录会话。)

其他因素是您的可扩展性和模块化。您解决了一些可扩展性问题。看看放置多个传输以平衡负载。对于模块化,请查看您想在哪里决定如何处理每个数据包或操作。例如,您如何处理和跟踪订阅数据?您可以将它放在您的运输工具上,但这会使使用多个运输工具变得更加困难。或者,如果您做出更接近核心服务器的决定,则可以使用更简单的传输并使用一些通用代码,如果您需要与 XMPP 以外的服务通信。权衡的是更复杂的核心服务器,具有更多的潜在漏洞。

于 2009-09-28T18:44:08.630 回答
2

您应该使用什么架构取决于非 XMPP 系统。

  1. 您是否操作非 XMPP 系统?如果是,您应该想办法为该系统添加一个 XMPP-S2S 接口,换句话说,使其充当 XMPP 服务器。AOL 正在将这种方法用于 AIM。不幸的是,他们限制了访问 GoogleTalk 的网关。

  2. 您不操作非 XMPP 系统,但它有一个您可以使用的联合接口 - 即您的网关可以作为服务器与其他系统通信,并有自己的命名空间。在这种情况下,您可以构建一个网关,作为双方的联合服务器。因为我不知道任何使用这种方法的网关示例,但是如果您想构建一个公共 XMPP-to-SIP 桥接器,您可以使用它。

  3. 如果非 XMPP 系统没有为您提供联合接口,那么您别无选择,只能充当一堆客户端。在 XMPP 世界中,这被称为“传输”。传输和普通服务器之间的区别基本上是:

    • 传输的 JID 是从另一个系统映射的(例如 john.doe\40example.net@msngateway.example.org - 真的很难看!)
    • 想要使用传输的 XMPP 用户需要在非 XMPP 系统上创建一个帐户,并将该帐户的登录凭据提供给传输服务。XMPP 协议甚至有一个协议扩展,允许 XMPP 用户进行带内传输注册。
于 2012-10-01T20:11:24.403 回答
0

另一种方法是与您的 XMPP 服务器供应商合作。大多数都有内部 API,可以从第三方应用程序注入存在。例如,Jabber XCP为此提供了一个非常易于使用的 API。

(披露:我为 Jabber, Inc 工作,该公司是 Jabber XCP 背后的公司)

于 2008-09-15T16:08:55.770 回答