我目前正在使用ActiveMQ来满足我的消息传递需求;除了几个db故障之外,它运行良好。但是,我至少考虑尝试使用RabbitMQ。但在此之前,我想了解以下内容:
JmsTemplate
,然后使用DefaultMessageListener
bean将队列连接到各自的处理程序。我可以用RabbitMQ基本上做同样的事吗?答案 0 :(得分:63)
RabbitMQ是AMQP代理,而ActiveMQ是JMS代理。我建议您阅读the AMQP wikipedia article以了解AMQP中使用的概念,这些概念与您在JMS中熟悉的概念不同。其中一个主要区别是,在AMQP中,生产者在不知道实际消息分发策略的情况下发送到交换机,而在JMS中,生产者以队列或主题为目标(因此知道消息路由的类型)。因此,很难说出更好或更差的事情,因为JMS和AMQP之间的语义非常不同。
RabbitMQ的队列和交换都是通过AMQP协议配置的,因此客户端库允许您配置所有目的地及其行为。 ActiveMQ需要特定的目标配置,因为JMS规范不涵盖任何管理方面。除此之外,RabbitMQ的系统配置是Erlang-esque,而ActiveMQ通常是用XML配置的。所以你必须习惯{tuple}和<>可爱的语法。 RabbitMQ通常通过OS软件包安装,而ActiveMQ发行版是您放在任何地方的档案(或者Maven deps,您将其嵌入到其他内容中)。
很好:)见Spring AMQP。
答案 1 :(得分:8)
AMQP是面向消息的中间件(MOM)的应用程序级标准。 JMS是Java的标准API,用于与MOM通信。
使用JMS的两个不同的Java应用程序可能正在使用不同的MOM,因此仍然无法进行通信。 ActiveMQ是一个带有JMS库的MOM系统,允许Java程序使用JMS访问它,但它不一定能与使用WebLogic MOM的其他JMS Java程序通信。
不同的AMQP MOM系统可以互相互操作(假设它们使用相同版本的AMQP),因为AMQP是与SMTP相同的标准。 AMQP MOM系统没有理由不为其Java客户端提供JMS库。例如,SwiftMQ提供了一个JMS API并使用AMQP 1.0。
不幸的是,并非所有AMQP系统(以及许多系统)都在使用AMQP的1.0版本。 RabbitMQ(在撰写本文时)尚未提供AMQP 1.0支持。其他一些AMQP系统是Apache QPID和StormMQ,但还有很多其他系统。一旦所有这些都支持AMQP 1.0,那么它们应该互相可互操作。
在http://activemq.apache.org/amqp.html的网站上,ActiveMQ说:“我们希望ActiveMQ在最终版本完成后能够实现最新版本。但是,目前,ActiveMQ还没有实现AMQP。”现在AMQP 1.0已经发布,ActiveMQ没有关于何时支持它的消息。
答案 2 :(得分:6)
由于RabbitMQ是AMQP代理,其配置主要通过AMQP本身处理,因此大多数问题没有任何意义。
RabbitMQ的一个棘手问题是许多操作系统包都是1.72,这已经过时了。你会做得更好,直接从他们的网站获得RabbitMQ 2.51的.deb或.rpm包。在那之后,你真正需要在AMQP之外做的唯一配置是使用rabbitmqctl创建vhosts和用户权限。或者,您可以下载Web管理控制台的.ez插件,并在重新启动RabbitMQ之前将它们放在正确的目录中。如果您使用的是2.51,则强烈建议使用此Web管理控制台,但如果您遇到Debian和Ubuntu使用的默认值1.72则不可能。
运行RabbitMQ后,您可以使用任何语言和任何AMQP库。我亲自接管了使用pika,amqplib和kombu的Python系统。现在我正在使用来自Scala的haigha和Java库,它们通过AMQP(当然还有MQ代理)相互交谈。
答案 3 :(得分:3)
比较JMS / AMQP概念以比较ActiveMQ和RabbitMQ并不是最重要的:ActiveMQ说AMQP,商业版中有RabbitMQ的JMS客户端(称为vFabric RabbitMQ)。然而,在某些用例中,一些AMQP概念(路由键)可能很有用。
我既使用了两者,又使用了两者: