整理XMPP

18

维基百科将XMPP定义为:

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

xmpp.org将XMPP定义为:

可扩展的消息传递和状态协议(XMPP)是一种用于实时通信的开放式XML技术,支持多种应用程序。

虽然我相信这两个定义都非常准确,但是对于我这个Java开发人员来说,它们没有告诉我XMPP可以拿来干什么!

例如,我听说XMPP可以与面向消息中间件(MOM)配合使用。怎么做?XMPP能否与我的Apache Camel路由、我的ESB或某些SOA实现集成,以提供更好/更快/更强大的业务层?如果可以,那怎么做?!?!

一个好的、易懂的XMPP解释,以及一些实际的例子(最好是面向MOM)将不胜感激。提前感谢!


1
+1。出色的问题陈述,问题范围和奖励说明。我完全支持这一点,因为最好的资源似乎再次被封锁,而在散文中提供的良好定义将适用于许多在SO上的人。谢谢! - MrGomez
5个回答

18

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

核心服务包括...

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

经典应用案例...

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

消息模式/方式...

  • 点对点消息用于向特定的接收者发送消息
  • 多用户消息用于向一组接收者发送消息
  • 发布/订阅支持用于大量事件的情况,系统对不同子集的事件感兴趣。发布者将事件放入主题中,订阅者指示他们感兴趣的主题。这将发布者/订阅者解耦,允许进行可扩展的实时消息传递。有关更多信息,请参见此文章: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将应用程序连接在一起。
    • 是否它是最佳技术选择取决于需求。
    • 一个很好的用例是交互式系统监视/管理... 这里有一些其他示例

    另外,Camel与XMPP的集成非常轻松。请参见此camel-xmpp单元测试,了解与Google Talk服务器接口的基本示例。 此外,Camel的框架允许您构建应用程序并轻松更换不同的消息传递技术(JMS、STOMP、mina等)。


    4

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

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

    让我以发布/订阅为例,这是一种典型的中间件模式,在你离开仅有少数实体的情况下,简单的消息传递就足够了。PubSub用于生产者产生信息并由其他实体(消费者)消耗信息的情况。通常,信息写入节点,订阅节点的消费者会在添加/更新/删除项目时接收到通知。发布/订阅可以优雅地处理大量用例,从排队长时间运行的作业并让工作人员处理它们,到微型博客。XMPP具有非常强大且广泛可用的扩展,以标准方式处理PubSub,描述在XEP-0060中,并提供处理发布、订阅、通知和安全性的工作流程。查看XEP中的用例将让您了解整个过程的简单性。

    现在,虽然大多数用例都可以使用(或滥用)现有的标准扩展来解决,但最终您可能需要一些其他地方没有覆盖的自定义协议。使用您选择的语言编写一个XMPP组件,定义自己的协议。然后将该组件连接到正在运行的XMPP服务器,并使用简单的命名空间让服务器知道您可以处理哪种类型的消息,并让服务器向连接到它的客户端广告您的协议功能。这可以变得非常简单或复杂。虽然缺乏更好的示例,但是此处是我编写的一个组件,利用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?

    希望这能帮助你找到需要的内容。


    你可能想看一下http://www.devdaily.com/java/jwarehouse/activemq/activemq-xmpp/。这是一个在ActiveMQ中使用XMPP作为传输的示例。在测试文件夹中,它包括一个代理和一个测试客户端。http://camel.apache.org/提到Apache ActiveMQ作为一个项目,利用Apache Camel作为路由和调解引擎。 - Peter Hofman

    0
    让我简单地向您介绍一下XMPP是什么?
    • XMPP(可扩展消息和状态协议)
    • 它是一种实时通信协议。
    • 基于XMPP的第一个即时通讯服务是Jabber.org。
    • 一个XMPP绑定是BOSH。其他包括TCP和WebSocket
    • BOSH是“同步HTTP上的双向流”,这是一种通过超文本传输协议(HTTP)进行双向通信的技术。
    • BOSH模拟了许多从传输控制协议(TCP)熟悉的传输原语。对于需要“推”和“拉”通信的应用程序,BOSH比大多数其他双向基于HTTP的传输协议和称为AJAX的技术更具带宽效率和响应性。
    • BOSH通过长轮询实现了这种效率和低延迟。
    那么XMPP是如何工作的呢?XMPP通过实现长轮询来实现低延迟。
    什么是“普通轮询”和“长轮询”?
    普通轮询:

    enter image description here

    考虑使用普通轮询的旧聊天应用程序。这里图表顶部表示客户端,底部表示服务器端。让超时时间为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.
    

    长轮询

    enter image description here

    图表的上半部分是客户端,下半部分是服务器。

    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的内容。

    如果你想要搭建自己的XMPP服务器,可以阅读这篇文章


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

    -2

    XMPP基本上是一个协议,用于聊天室客户端与聊天服务器进行通信。Camel允许您集成XMPP,以便您可以从该机制中消费消息或生成消息http://camel.apache.org/xmpp.html

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

    我很少考虑使用XMPP与集成机制一起使用,也许作为向开发人员聊天室发送通知的机制,或者作为控制监视聊天服务器以获取指令的服务器的“管道胶带”机制。


    2
    你的大部分陈述都是不准确的。XMPP支持简单的聊天消息并不意味着它是一个聊天协议。XMPP还可以轻松地提供可扩展的PubSub支持(http://xmpp.org/extensions/xep-0060.html)。最重要的是,XMPP提供了所有必要的废料来定义和扩展新协议。 - ggozad
    @ggozad - 你似乎对XMPP的理解非常自信。你愿意在这里发表一下你的看法吗? - IAmYourFaja
    1
    @AdamTannon 我曾经考虑过这样做,但我总是讨厌Java,无法轻松地提供它的示例 ;) 如果没有人提供答案,也许我会尝试一下,如果您满意概念性的XML示例。 - ggozad
    如果示例足够好,我可以接受不是Java的语言。Java是我最擅长的语言,因此用它来表达想法会更容易一些,但是我对Python(如您的个人资料所示)或其他第三代编程语言(.NET等)也有不错的理解能力,在一个实际的示例被呈现出来后,我可以联系到各种语言之间的共通之处。 - IAmYourFaja
    @ggozad 他是正确的。XMPP最初就是设计成IM协议的。在他们的RFC介绍中甚至有这样的说法:“它主要用于构建即时通讯。” - Andrew T Finnell
    2
    @AndrewFinnell 我并不认为他是错误的。我认为他是不准确的;)。XMPP 通过设计 具有最小的核心,它涉及到在线状态和消息传递。然而,存在着大量默认扩展,所有服务器都提供这些扩展,这些扩展实际上使XMPP变得强大,并且对于OP来说非常有趣。大多数XMPP部署都是关于额外功能而不是核心功能。 - ggozad

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接