从ActiveMQ切换到RabbitMQ

时间:2011-08-12 17:45:01

标签: activemq rabbitmq amqp

我目前正在使用ActiveMQ来满足我的消息传递需求;除了几个db故障之外,它运行良好。但是,我至少考虑尝试使用RabbitMQ。但在此之前,我想了解以下内容:

  1. RabbitMQ与ActiveMQ的不同之处是什么? RabbitMQ比ActiveMQ做得更好还是更差?
  2. 相比之下,RabbitMQ配置有多容易/困难?
  3. RabbitMQ与Spring的集成程度如何?
    • 使用ActiveMQ,我只需将连接工厂bean连接到JmsTemplate,然后使用DefaultMessageListener bean将队列连接到各自的处理程序。我可以用RabbitMQ基本上做同样的事吗?

4 个答案:

答案 0 :(得分:63)

  1. RabbitMQ是AMQP代理,而ActiveMQ是JMS代理。我建议您阅读the AMQP wikipedia article以了解AMQP中使用的概念,这些概念与您在JMS中熟悉的概念不同。其中一个主要区别是,在AMQP中,生产者在不知道实际消息分发策略的情况下发送到交换机,而在JMS中,生产者以队列或主题为目标(因此知道消息路由的类型)。因此,很难说出更好或更差的事情,因为JMS和AMQP之间的语义非常不同。

  2. RabbitMQ的队列和交换都是通过AMQP协议配置的,因此客户端库允许您配置所有目的地及其行为。 ActiveMQ需要特定的目标配置,因为JMS规范不涵盖任何管理方面。除此之外,RabbitMQ的系统配置是Erlang-esque,而ActiveMQ通常是用XML配置的。所以你必须习惯{tuple}和<>可爱的语法。 RabbitMQ通常通过OS软件包安装,而ActiveMQ发行版是您放在任何地方的档案(或者Maven deps,您将其嵌入到其他内容中)。

  3. 很好:)见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概念(路由键)可能很有用。

我既使用了两者,又使用了两者:

  • 发现Erlang + RabbitMQ在某些系统(过时的软件包存储库)上比Java + ActiveMQ更难安装
  • RabbitMQ有一些不错的集群/ HA选项(镜像队列,集群联合)。不需要共享的ZooKeeper或共享数据库,但是应该处理“裂脑”问题。
  • ActiveMQ更重(内存消耗)
  • ActiveMQ与Apache Camel完美集成,使用RabbitMQ你最好使用Spring Integration(Camel RabbitMQ / AMQP有点粗糙)
  • ActiveMQ支持XA事务,可以嵌入Java应用程序,可以嵌入Camel。
  • 使用ActiveMQ进行Java自动化测试更容易(嵌入式代理)