市场上的消息中间件:mom4jmom4j是一个完全实现JMS1.1规范的消息中间件并且向下兼容JMS1.0与1.02.它提供了自己的消息处理存储使它独立于关系数据与语言,所以它的客户端可以用任何语言开发.OpenJMSOpenJMS是一个开源的JavaMessageServiceAPI1.0.2规范的实现,它包含有以下特性:*.它既支持点到点(point-to-point)(PTP)模型和发布/订阅(Pub/Sub)模型。*.支持同步与异步消息发送*.JDBC持久性管理使用数据库表来存储消息*.可视化管理界面。*.Applet支持。*.能够与JakartaTomcat这样的Servlet容器结合。*.支持RMI,TCP,HTTP与SSL协议。*.客户端验证*.提供可靠消息传输、事务和消息过滤UberMQUberMQ完全实现了JavaMessageService规范。UberMQ是因为现有的许多JMS提供商已经违背了分布式计算的核心原则:快速与简单而开发的。HermesJMS利用它提供的SwingUI可以很好的实现监控JMSproviders。ActiveMQActiveMQ是一个开放源码基于Apache2.0licenced发布并实现了JMS1.1。它能够与Geronimo,轻量级容器和任Java应用程序无缝的给合。SomnifugiSomnifugi使得工作在同一个java虚拟机中的线程能实现消息互发。MantaRayMantaRay基于peer-2-peer技术。它具有以下特性:1.它既支持点对点(point-to-point)的域,又支持发布/订阅(publish/subscribe)类型的域。2.并且提供对下列类型的支持:经认可的消息传递,事务型消息的传递,一致性消息和具有持久性的订阅者支持。3.消息过滤体制。4.能与WebLogicandWebSphere给合。5.支持TCP,UDP与HTTP传输协。PresumoPresumo也是一个实现JavaMessageServiceAPI的JMS消息中间件。JORAMJORAM一个类似于openJMS分布在ObjectWeb之下的JMS消息中间件。JMS4SpreadJMS4Spread是一个消息系统.它部分地实现了Java消息服务(JMS)API.OpenMessageQueueOpenMessageQueue是SunJavaSystemMessageQueue的一个开源版本。Openmessagequeue是一个企业级,可升级,非常成熟的消息服务器。它为面向消息的系统集成提供一套完整的JMS(JavaMessageService)实现。由于OpenMQ源自Sun的JavaMessageQueue,所以其具有JavaSystemMessageQueue拥有的所有特性,功能和性能。FFMQFFMQ是一个轻量级,高性能,快速的NativeJMS1.1开源实现。支持SSL远程连接,自动防故障的持久化机制,基于模板定义目的地(Destination),采用模式匹配自动创建目的地(Destination)。MQSSave/MQSLoadMQSSave是一个简单的Java程序,能够读取MQSeries队列的消息保存至文件中。而MQSLoad是一相反的Java程序,能够读取文件中的消息然后加载至MQSeries队列中。HornetQHornetQ是一个支持集群和多种协议,可嵌入、高性能的异步消息系统。HornetQ完全支持JMS,HornetQ不但支持JMS1.1API同时也定义属于自己的消息API,这可以最大限度的提升HornetQ的性能和灵活性。在不久的将来更多的协议将被HornetQ支持。HornetQ拥有超高的性能,HornetQ在持久化消息方面的性能可以轻易的超于其它常见的非持久化消息引擎的性能。当然,HornetQ的非持久化消息的性能会表现的更好!HornetQ完全使用POJO,纯POJO的设计让HornetQ可以尽可能少的以来第三方的包。从设计模式来说,HornetQ这样的设计入侵性也最小。HornetQ既可以独立运行,也可以与其它Java应用程序服务器集成使用。HornetQ拥有完善的错误处理机制,HornetQ提供服务器复制和故障自动转移功能,该功能可以消除消息丢失或多个重复信息导致服务器出错。HornetQ提供了灵活的集群功能,通过创建HornetQ集群,您可以享受到到消息的负载均衡带来的性能提升。您也可以通过集群,组成一个全球性的消息网络。您也可以灵活的配置消息路由。HornetQ拥有强大的管理功能。HornetQ提供了大量的管理API和监控服务器。它可以无缝的与应用程序服务器整合,并共同工作在一个HA环境中。ApacheQpidApacheQpid是最新开放企业信息标准AMQP(AdvancedMessageQueuingProtocol)的一个开源实现。Java版实现完全支持JMS标准,可运行在任意Java平台上。此外Qpid还提供AMQPClientAPIs的各种语言实现包括:C++Java,fullyconformantwithJMS1.1C#.NET,0-10usingWCFRubyPythonSpringAMQPSpringAMQP是一个用于替换原先SpringJMS支持的消息解决方案。提供收发消息的模板,还支持基于消息驱动的POJO。用法和配置与Spring中对JMS的支持一样。这个项目包含Java和.NET两个版本。KafkaKafka是一个高吞吐量分布式消息系统。linkedin开源的kafka。Kafka就跟这个名字一样,设计非常独特。首先,kafka的开发者们认为不需要在内存里缓存什么数据,操作系统的文件缓存已经足够完善和强大,只要你不搞随机写,顺序读写的性能是非常高效的。kafka的数据只会顺序append,数据的删除策略是累积到一定程度或者超过一定时间再删除。Kafka另一个独特的地方是将消费者信息保存在客户端而不是MQ服务器,这样服务器就不用记录消息的投递过程,每个客户端都自己知道自己下一次应该从什么地方什么位置读取消息,消息的投递过程也是采用客户端主动pull的模型,这样大大减轻了服务器的负担。Kafka还强调减少数据的序列化和拷贝开销,它会将一些消息组织成MessageSet做批量存储和发送,并且客户端在pull数据的时候,尽量以zero-copy的方式传输,利用sendfile(对应java里的FileChannel.transferTo/transferFrom)这样的高级IO函数来减少拷贝开销。可见,kafka是一个精心设计,特定于某些应用的MQ系统,这种偏向特定领域的MQ系统我估计会越来越多,垂直化的产品策略值的考虑。play-rabbitmq这是Play!Framework开发框架的一个扩展模块。用于生产和消费RabbitMQ消息。队列消息系统FQueueFQueue是一个高性能、基于磁盘持久存储的队列消息系统。兼容memcached协议,能用memcached的语言都可以良好的与它通信。FQueue为你提供一个不需要特别优化,高性能的一个消息系统。特性1.基于磁盘持久化存储。2.支持memcached协议。3.支持多队列,密码验证功能。4.高性能,能达到数十万qps。5.低内存消耗。100-300M内存即可工作得很好。6.高效率IO读写算法,IO效率高。7.纯JAVA代码。支持进程内JVM级别的直接调用。8.在不需要强顺序的场景下,支持多机负载均衡。不支持1.不支持topic方式的订阅功能。2.不支持主从复制。主流消息中间件及选型推荐:ActiveMQ:(还有升级版叫Apollo,由于转向Scala,原来的架构都要改掉。但是只支持storm协议,不支持JMS),在网络上别人反映,消息量越来越大时,当出现消息堆积时,性能争骤下降,主要卡在磁盘写入,用了硬件加速,也还是不能忍受。消息中间件的技术选型心得-RabbitMQ、ActiveMQ和ZeroMQ作者:chszs,转载需注明。博客主页:、ActiveMQ和ZeroMQ都是极好的消息中间件,但是我们在项目中该选择哪个更适合呢?很多开发者面临这个烦恼。下面我会对这三个消息中间件做一个比较,看了后你们就心中有数了。RabbitMQ是AMQP协议领先的一个实现,它实现了代理(Broker)架构,意味着消息在发送到客户端之前可以在中央节点上排队。此特性使得RabbitMQ易于使用和部署,适宜于很多场景如路由、负载均衡或消息持久化等,用消息队列只需几行代码即可搞定。但是,这使得它的可扩展性差,速度较慢,因为中央节点增加了延迟,消息封装后也比较大。ZeroMQ是一个非常轻量级的消息系统,专门为高吞吐量/低延迟的场景开发,在金融界的应用中经常可以发现它。与RabbitMQ相比,ZeroMQ支持许多高级消息场景,但是你必须实现ZeroMQ框架中的各个块(比如Socket或Device等)。ZeroMQ非常灵活,但是你必须学习它的80页的手册(如果你要写一个分布式系统,一定要阅读它)。ActiveMQ居于两者之间,类似于ZemoMQ,它可以部署于代理模式和P2P模式。类似于RabbitMQ,它易于实现高级场景,而且只需付出低消耗。它被誉为消息中间件的“瑞士军刀”。要注意一点,ActiveMQ的下一代产品为Apollo。最终,这三个产品:1.都有客户端API且支持多种编程语言;2.都有大量的文档;3.都提供了积极的支持。ActiveMQRabbitMQZeroMQ遵循规范JMS1.1及j2ee1.4AMPQ-----架构模型消息代理架构Broker消息代理架构Brokerc/s架构实现语言JavaErlangc/c++支持消息协议StompAMPQ、Stomp等--------主要推动力量Apache、RedhatLshift、Vmware、SpringSourceIMatix支持编程语言C、Java、PythonC、Java、PythonC、Java、Python编程复杂度复杂简单中等持久化支持支持,不支持第三方数据库发送端缓存性能一般一般高三个经典消息中间件的比较对于消息中间件,绝大多数熟悉的是MQ(IBM公司出品),这是目前使用最广泛的中间件产品。还有两个也比较流行,他们是JMS和RV。JMS即JAVA消息服务(JavaMessageService)应用程序接口是一个JAVA平台中关于面向消息中间件的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信,是一个与具体平台无关的API。TIBCORendezvous(或称为TIBCORV)也是一种中间件,具有发布/订阅(Publish/Subscribe)、基于主题寻址(Subject-BasedAddressing)和自定义数据信息(Self-DescribingDataMessages)等专利技术功能,使不同应用平台上的信息在一个共享的虚拟总线InformationBus(TIB)上进行传输交换。先总结一下消息中间件的功能,以上的三类中间件都实现了这些功能。实现消息的异步发送接收,发布订阅,使得两端的应用解耦(减少或解除应用程序之间的耦合度)。实现消息持久化机制,保证消息可靠性传输。优化网络传输,支持断点续传。1、区别之是否分布式RV和MQ都是分布式结构的,和JMS消息中间件的星型结构不同。分布式消息中间件的Sever在应用环境里都会部署多个,彼此互联,没有主备之分。JMS消息中间件的应用部署一般都是主备两个Server,消息的发送和接收应用平时和主Server相连,有问题时切换到备Server,主备Server共用公共的存储设备来保存消息。2、区别之是否接收端主动MQ和JMS消息中间件都采用消息接收端主动接收消息的方式。消息从发送端发出后,首先会缓存到Server上,接收端应用发起一个接收消息的请求,Ser