浅议消息中间件技术标准与开源实现

        使用消息中间件是企业应用中降低模块间耦合的重要方式,开源和商用的消息中间件产品也很多,这些产品都遵循一种或多种消息中间件技术标准。在消息中间件领域有两类技术标准:

1、面向接口的消息服务标准:这类标准规定了消息服务的接口,但没有规定采用何种方式实现,可以开发新的应用层协议或者直接在TCP上进行套接字编程实现这些接口。面向接口消息服务使用最广泛的是JMS标准,多个厂商提供了JMS的实现,JMS比较重要的开源实现包括Apache ActiveMQOpenJMS等。

2、面向协议的消息服务标准:这类标准定义了新的应用层协议,从协议的行为,消息格式方面体现消息服务的各项功能,但是没有定义消息服务的编程接口。这类标准较多,包括AMQPOpenwireAMQP较为流行,其主流实现有RabbitMQOpenAMQ

        下面主要关注两种主流的消息服务标准,JMSAMQP。综上所述,JMSAMQP并不是同一层次上的概念,JMS是消息服务的接口标准,没有规定采用何种应用层协议实现;而AMQP是协议级别的消息标准,而没有规定消息服务接口。因而AMQP的互操作性较好,而JMS则更使用更为简单。目前主流的AMQP实现是RabbitMQ,并且Spring AMQP也有替换之前Spring JMS的趋势。

        既然JMSAMQP不是一个层次上的标准,这就意味着某种消息服务的实现可以既符合JMS标准,也符合AMQP协议,即采用AMQP协议实现JMS接口标准。同时满足这两种标准的实现是Apache QpidApache ActiveMQJMS的实现,底层实现了OpenWire标准,从5.8版本开始兼容AMQP协议。

JMS

        Java关于消息服务的标准是JMS,实现JMS标准的软件可以作为Java下的消息中间件服务器。jmsJava消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,类似于JDBC,需要不同的提供商进行各自的实现。

        JMS消息类型包括点对点消息和发布订阅消息:

1、点对点消息:这种消息队列可以同时有多个发送者,每个发送着都可以自由的向队列中发送消息,被发送的消息按照先发先进的原则一次排列在队列中,先发的消息排列在队列的前面排列在队列中的消息可以立即被使用者使用,也可以等一段时间才被使用者使用!通常有队列服务器维持消息的持久化。默认情况按照在队列中次序一次使用,一旦一个消息被使用,该消息就会被从队列中删除,此后下一个消息才会被使用。

2、发布-订阅消息:所有发送着可以自由的向队列中发送消息,先发先进的原则排列,这种消息队列会把当前队列中的消息一次广播给当前队列的所有使用者,一个消息可以被多个使用者接受并使用,默认情况下,如果当前队列没有使用者,则队列中消息也自动被丢失,但是有些服务器可以修改配置改变队列的默认行为,使队列在没有使用者时,所有的消息被保留,直到有使用者来消费队列中的消息。

        JMS消息队列操作模式包括同步消息获取和异步消息获取。

        JMS的开源实现主要有下面五种

Apache ActiveMQ

        Apache ActiveMQJMS1.1标准的实现,底层的应用层消息协议使用的并不是AMQP,而是OpenWire协议。但是从5.8版本开始也兼容AMQP协议。目前的版本是5.8

        Apache ActiveMQ遵从Apache 2.0开源协议,比较成熟,其特点包括:

1、纯Java编写,具备跨平台特性;

2、支持嵌入Spring框架;

3、在众多JavaEE 1.4服务器中工作良好,如TomEEGeronimoJBossGlassfishWeblogic

4、支持高性能的JDBC持久化机制;

5、支持Rest APIAjax Web StreamCXFAxis

6、支持集群;

7、支持的客户端开发语言包括CC++C#DelphiErlangAdobe FlashHaskellJavaJavaScriptPerlPHPPikePythonRuby

8、支持的消息服务协议包括OpenWireRESTSTOMPWS-NotificationXMPP以及AMQP

9、支持广泛的传输协议,例如in-vmTCPUDPSSLNIO、多播、JGroupsJXTA

        更详细的特性列表参考http://activemq.apache.org/features.html

Jboss HornetQ

        HornetQ是一个支持集群和多种协议,可嵌入、高性能的异步消息系统。HornetQ完全支持JMSHornetQ不但支持JMS1.1 API同时也定义属于自己的消息API,这可以最大限度的提升HornetQ的性能和灵活性。在不久的将来更多的协议将被HornetQ支持。目前最新版本为2.3.0

        HornetQ的主要特性包括如下方面:

1、支持集群,包括负载均衡和故障自动转移;

2、能够支持庞大的TB级别消息量;

3、高性能,单机处理速度高;

4、使用方面,API简单;

5、完全使用POJO,纯POJO的设计让HornetQ可以尽可能少的依赖第三方的包。

6、可以独立运行,也可以无缝整合进Jboss应用服务器5.0及以上版本(默认自带);

7、支持TCPSSLHttpServlet和虚拟机内部传输;

8、客户端流控机制,非阻塞消息传输和客户端负载均衡支持;

9、支持web socketRest API

        更详细的特性列表参考https://community.jboss.org/wiki/HornetQFeatures

OpenJMS

        OpenJMS是一个开源的JMS 1.1标准的实现,托管于sourceforge目前最新版本为0.7.7版,版本号过低,还不是很成熟。

        OpenJMS特点主要包括既支持点到点(point-to-point)(PTP)模型和发布/订阅(Pub/Sub)模型。支持同步与异步消息发送。JDBC持久性管理使用数据库表来存储消息 可视化管理界面。Applet支持。能够与Jakarta Tomcat这样的Servlet容器结合。支持RMI, TCP, HTTP SSL协议。客户端验证、提供可靠消息传输、事务和消息过滤。

Open Message Queue

        Open Message QueueOpen MQ)是Sun Java System Message Queue的一个开源版本。Open message queue是一个企业级,可升级,非常成熟的消息服务器。它为面向消息的系统集成提供一套完整的JMSJava Message Service )实现。由于Sun公司被Oracle公司收购,因此Open Message Queue目前由Oracle公司旗下的开源社区负责维护,并成为Oracle的应用服务器Glassfish的默认消息服务组件。

        Open MQ的主要特性包括如下方面:

1、可扩展的分布式消息服务器集群支持;

2、支持SOAPHTTP协议消息格式;

3、支持JavaC客户端API

4、可扩展的JCA 1.5兼容资源适配器;

5、流量与连接控制机制。

        更详细的特性列表参考https://mq.java.net/features.html

AMQP

        AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP在消息提供者和客户端的行为进行了强制规定,使得不同卖商之间真正实现了互操作能力。JMS是早期消息中间件进行标准化的一个尝试,它仅仅是在API级进行了规范,离创建互操作能力还差很远。与JMS不同,AMQP是一个Wire级的协议,它描述了在网络上传输的数据的格式,以字节为流。因此任何遵守此数据格式的工具,其创建和解释消息,都能与其他兼容工具进行互操作。

        应用层的消息协议除了AMQP外,还有OpenWireXMPP等,但是AMQP应用最为广泛。

RabbitMQ

        RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现较好。RabbitMQ遵从开源协议Mozilla公共许可证,目前最新稳定版本为3.1.1版。

        RabbitMQ的主要特性包括如下方面:

1、定义Exchange、队列、通道等概念,使对消息投递的控制更加精准灵活;

2、支持高可用,以及消息和队列的持久化;

3、支持集群,允许节点动态变化和节点故障;

4、支持众多语言的客户端,包括JavaRubyPython.NetPHPPerlC/C++ErlangLispHaskellOcamlGo等;

5、支持公有云服务,包括Amazon EC2Cloud Foundry等;

6、支持众多的插件,功能可扩展;

7、高性能、消息吞吐量大。

        官方的特性列表参考http://www.rabbitmq.com/features.html

OpenAMQ

        OpenAMQ 是一个业务消息产品,为你提供一个分布式的消息通讯框架。消息的异步传递的。主要为高性能和可靠性而设计。该项目服务器端采用 GPL 授权协议,客户端(PythonJavaRubyC)是 BSD 授权协议。目前的最新版本是1.3版。

OpenAMQ的特性如下:

1、部署的性能扩展性强;

2、官方提供C语言的客户端API,其他语言的API由第三方提供,包括PythonJava JMSRuby

3、支持集群和高可用机制、性能较高。

        更多特性可以参考http://www.openamq.org/doc:user-1-introduction

Apache Qpid

        Apache Qpid (Open Source AMQP Messaging) 是一个跨平台的企业通讯解决方案,实现了高级消息队列协议,遵守Apache 2.0开源协议。提供了 JavaC++ 两种服务端版本以及 JavaC++.NETPythonRuby语言的客户端。目前软件的最新版本是0.22版。

        Apache Qpid的主要特点如下:

1提供Java JMS兼容的客户端接口,客户端支持C++.NETPythonRuby语言;

2提供C++Java两种版本的服务器;

3、完全兼容AMQP协议标准

4、支持集群、联邦和灾难恢复;

5、性能优越,速度快。

总结

        综合上面对各个主流消息服务器的特性分析,主要从成熟度,使用数量和功能特性方面进行选择。最终较好的消息中间件候选者包括Apache ActiveMQJBoss HornetQRabbitMQ。使用最广泛的是ActiveMQ,功能丰富并且对Web服务器的整合兼容性好;RabbitMQ使用度次之,号称性能优良,关于ActiveMQRabbitMQ的性能测试比较可以参考http://www.cnblogs.com/amityat/archive/2011/08/31/2160293.html

        如果希望和JBoss结合使用,建议首选Jboss HornetQ,实际上JBoss已经自带。一般情况下建议选择Apache ActiveMQ。如果业务应用对消息服务器的性能有较高要求,则需要这些消息服务中间件进行性能测试才可确定最终选择。

你可能感兴趣的:(开源技术,消息中间件,JMS,AMQP,ActiveMQ,RabbitMQ)