争吵 XMPP

Posted

技术标签:

【中文标题】争吵 XMPP【英文标题】:Wrangling up XMPP 【发布时间】:2012-04-20 12:43:59 【问题描述】:

***将XMPP定义为:

...一种基于 XML 的面向消息的中间件的开放标准通信协议。

xmpp.org 将XMPP 定义为:

Extensible Messaging and Presence Protocol (XMPP) 是一种用于实时通信的开放 XML 技术,它为各种应用程序提供支持。

尽管我确信这两个定义都非常准确,但它们并没有告诉我任何事情关于我(Java 开发人员)实际上可以使用 XMPP 做什么

例如,我听说 XMPP 可以与面向消息的中间件 (MOM) 一起使用。为何如此? XMPP 能否以某种方式与我的 Apache Camel 路由、我的 ESB 或一些 SOA 实现集成以提供更好/更快/更健壮的业务层?如果是这样,如何?!?!

非常感谢您对 XMPP 提供良好的 King's-English 解释以及一些实际示例(最好以 MOM 为中心)。提前致谢!

【问题讨论】:

+1。好的问题陈述、问题界限和赏金陈述。我完全支持这一点,因为最好的资源再次出现在be paywalled,并且散文中的良好工作定义将广泛适用于 SO 上的许多人。谢谢! 【参考方案1】:

XMPP 基本上是聊天室客户端与聊天服务器对话的协议。 Camel 确实允许您与 XMPP 集成,以便您可以从这种机制消费或生成消息http://camel.apache.org/xmpp.html

当您开始谈论业务层、ESB、SOA 等以及 MOM 时,您可能正在寻找一种支持点对点和发布订阅消息传递的消息传递机制。您可能还在考虑诸如保证消息传递、高可用性和细粒度安全性等问题。您不会从将文本消息读取和写入聊天服务器的机制中获得这些信息。像 ActiveMQ 这样的消息传递平台可能更适合。

在极少数情况下,我会考虑将 XMPP 与集成机制结合使用,可能作为开发聊天室的通知机制,或者作为用于控制服务器的管道磁带机制,以监控聊天服务器以获取指令。

【讨论】:

您的大部分陈述都不准确。 XMPP 支持简单的聊天消息这一事实并不能使其成为聊天协议。 XMPP 也很容易为 PubSub (xmpp.org/extensions/xep-0060.html) 提供可扩展的支持。最重要的是,XMPP 提供了定义和扩展新协议所需的所有内容。 @ggozad - 你似乎对你对 XMPP 的理解很有信心。您愿意在这里给出答案吗? @AdamTannon 我曾考虑这样做,但我一直很讨厌 Java,以至于无法轻易提供示例;)也许如果没有人想出答案,我会尝试一下对概念性 XML 示例感到满意。 如果这个例子足够好,我会接受不是 Java 的东西。 Java 是我最擅长的语言,所以我更容易用它来表达想法,但我对 Python(如您的个人资料所示)或其他 3GL(.NET 等)有很好的理解,可以将这些点连接起来已经为我提供了可靠的示例。 @AndrewFinnell 我并不认为他是不正确的。我声称他不准确;)。 XMPP 按设计有一个关于存在和消息传递的最小核心。尽管存在大量默认扩展,但所有服务器都附带提供了实际上使 XMPP 很棒并且对 OP 感兴趣的东西。大多数 XMPP 部署都是关于附加功能而不是核心。【参考方案2】:

XMPP 可用于各种基于消息传递的应用程序。基本上,它提供了可用于构建基于 XML 的消息传递应用程序的核心服务。它基于分散的客户端-服务器架构,并利用长寿命 TCP 连接进行通信......

核心服务包括...

频道加密、身份验证、状态、联系人列表、一对一消息、多方消息、通知 服务发现、功能广告、结构化数据格式、工作流管理、点对点媒体会话

教科书用例...

即时消息(使用状态、联系人列表、一对一消息) 群聊、游戏、系统控制、地理位置、中间件/云计算、数据联合 机器人(天气、数据库接口、系统监控)

消息模式/模式...

点对点消息用于发送给特定的接收者 多用户消息用于向一组接收者发送消息 当有大量事件并且系统对不同的事件子集感兴趣时,使用发布/订阅支持。发布者将事件放入主题中,订阅者指示他们感兴趣的主题。这将发布者/订阅者解耦并允许可扩展的实时消息传递。更多信息请看这篇文章:http://www.isode.com/whitepapers/xmpp-pubsub.html

部署方法...

XMPP 用户 - 以普通用户身份连接并响应发给该用户的请求 XMPP 服务器插件 - 作为服务器插件架构的一部分部署 XMPP 组件 - XMPP 服务器外部的服务,可连接并像插件一样工作

Java 集成

Smack API - 一个纯 Java 库,它可以嵌入到您的应用程序中,以创建从完整的 XMPP 客户端到简单的 XMPP 集成(例如发送通知消息和启用状态的设备)的任何内容。 Camel XMPP - Camel 组件,允许在 Camel 路由中与 Smack API 集成

针对您的具体问题“可以在 SOA/中间件中使用吗?”....

是的,它可用于通过 XML 消息传递和 XMPP API 将应用程序连接在一起 最佳技术选择在很大程度上取决于需求 一个很好的用例,交互式系统监控/管理...here are some other examples

此外,XMPP 与 Camel 的集成也很简单。请参阅此camel-xmpp unit test,了解与 Google Talk 服务器连接的基本示例。此外,Camel 的框架允许您构建应用程序并轻松更换不同的消息传递技术(JMS、STOMP、mina 等)。

【讨论】:

【参考方案3】:

XMPP 是一种开放且可扩展的实时通信标准。

XMPP 带有一个在其rfc 中定义的核心,它描述了用于进行即时消息传递和交换存在信息的基本协议。然而,XMPP 真正的亮点在于它的可扩展性:XMPP 定义了构建块(存在、消息和 iq 节)来创建通信协议。这些通常作为扩展。当前可用的标准扩展列表可以在here 找到。其中最重要的通常适用于所有流行的 XMPP 服务器。 正是这种可扩展性使 XMPP 适合作为面向消息的中间件。

让我以 Publish-Subscribe 为例,它是中间件的典型模式,一旦您离开具有一些简单消息传递就足够的实体的场景,它就成为必需品。 PubSub 用于实体或生产者 生成要由其他实体消费者 消费的信息的情况。通常,信息会写入消费者订阅的节点。订阅后,他们会在添加/更新/删除项目时收到通知。 PubSub 可以优雅地涵盖大量的用例,从排队长期运行的工作并让工人处理它们,到微博。 XMPP 有一个非常强大且广泛可用的扩展,可以以标准方式处理 PubSub,如XEP-0060 中所述,并提供开箱即用的工作流程来处理发布、订阅、通知和安全性。查看 XEP 中的用例会让您了解整个事情的简单性。

现在,虽然大多数用例都可以通过使用(或滥用)现有的标准扩展来涵盖,但最终您可能需要一些其他地方未涵盖的额外自定义协议。使用您选择的语言,您可以编写一个XMPP 组件来定义您自己的协议。然后,您将组件连接到您正在运行的 XMPP 服务器,并通过使用简单的命名空间让服务器知道您可以处理什么样的消息,并让服务器向连接到它的客户端宣传您的协议功能。您可以做到多么简单或复杂,这没有止境。缺乏更好的例子,但可能足以说明,here 是我编写的一个组件,它利用 XMPP 在 Plone CMS 中进行实时协作编辑(类似于 Google 文档)。虽然细节可能会变得复杂,但我认为查看该页面上的“协议规范”会给你一个想法。

最后,关于 @boday 提到的 Java 特定库,周围有一些库使其易于上手以及 Apache Camel 集成(尽管据我所知,它只进行简单的消息传递)。但请记住,在了解 XMPP 的工作原理以及能够超越使用现有库的基础上进行投资是非常值得的,并且可以带来极其强大且简单的集成。

【讨论】:

【参考方案4】:

我可以开始使用 Google 组合来自互联网上各种来源的信息(关键字:XMPP Java MoM 示例),重写(甚至复制)XMPP 的定义,但我当然不会这样做。太多了。我也没有可供您使用的示例。

下面我将列出我认为最有趣的链接,以便您开始阅读并获得有关该主题的更多知识。

1) http://www.xmpp.org/ 这可能是最好的起点。从左到右和从上到下浏览菜单。这就是我所做的。该站点列出了服务器、客户端和库,因此您应该能够通过这种方式找到所需的示例。

2) http://www.ibm.com/developerworks/webservices/library/x-xmppintro/index.html 明确的文章,其中也提到了 MoM。没有 Java 示例,只有 Ruby。

3) http://fyi.oreilly.com/2009/05/what-can-you-do-with-xmpp.html 也许你应该把书拿过来?文章中没有示例。

4) http://kirkwylie.blogspot.com/2008/07/real-mom-is-hard-lets-use-xmpp.html 有趣的文章,最后一行基本上说:如果可以使用 AMQP 或 JMS,为什么还要使用 XMPP?

我希望这可以帮助你找到你需要的东西。

【讨论】:

您可能还想看看devdaily.com/java/jwarehouse/activemq/activemq-xmpp。这是在 ActiveMQ 中使用 XMPP 作为传输的示例。在 test 文件夹中,它包含一个代理和一个测试客户端。 camel.apache.org 提到 Apache ActiveMQ 作为一个项目来利用 Apache Camel 作为路由和中介引擎。【参考方案5】:

让我简要介绍一下什么是 XMPP

XMPP(可扩展消息传递和状态协议) 它是一种实时通信协议。 第一个基于 XMPP 的 IM 服务是 Jabber.org 一个 XMPP 绑定是BOSH。其他包括 TCP 和WebSocket。 BOSH 是“基于同步 HTTP 的双向流”,一种通过超文本传输​​协议 (HTTP) 进行双向通信的技术。 BOSH 模拟了传输控制协议 (TCP) 中熟悉的许多传输原语。对于应用程序 需要“推”和“拉”通信,BOSH 显着 比大多数其他双向更节省带宽和响应速度 基于 HTTP 的传输协议和称为 AJAX 的技术。 BOSH 通过长轮询实现了这一效率和低延迟。

XMPP 如何工作

XMPP 通过实现长轮询实现低延迟。

什么是正常轮询长轮询

正常投票:

考虑使用普通轮询的旧聊天应用程序。这里图表的顶部表示客户端。底部表示服务器端。让超时时间为 5 分钟。

Client asks the server : " Is there any new message for me ?"
Server Responds : "No ! "

                   After 5 min

Client asks the server : " Is there any new message for me ?"
Server Responds : "No !"

                  After 1 min

Client Receives a message

                  After 4 min

Client asks the server : " Is there any new message for me ?"
Server Responds : "Yes! " + message.

长轮询

图表的顶部是客户端。底部是服务器。

Client asks the server : " Is there any new message for me ?"
Server Answers : "No ! But you may soon receive a new message, so let me just hold your client state for 5 min in the server."

                  After 5 min

Server Responds : "No !"
Client asks the server : " Is there any new message for me ?"
Server Answers : "No ! But you may soon receive a new message, so let me just hold your client state for 5 min in the server."

                  After 1 min

Client Receives a message
Server Responds : "Yes! " + message.

您可以清楚地看到通信发生的即时性。

您可以阅读有关 XMPP 的更多信息HERE

如果您想建立自己的 XMPP 服务器,请阅读this。

【讨论】:

BOSH 只是 XMPP 支持的多种绑定之一。其他包括 TCP 和 websocket。

以上是关于争吵 XMPP的主要内容,如果未能解决你的问题,请参考以下文章

开发工具:让前后端联调不再争吵——Apifox

数据包争吵从C到C ++或者...... Variant和Any都不是联盟

XMPP学习及使用1

一个大型后台管理系统,应该用前后端分离吗?

HDU 3081:Marriage Match II(二分图匹配+并查集)

开发一个大型后台管理系统,应该用前后端分离的技术方案吗?