从ActiveMQ切换到RabbitMQ

我目前正在使用ActiveMQ来满足我的消息需求; 除了几个db失败之外,它运行良好。 不过,我至less考虑试用RabbitMQ。 但在此之前,我想了解以下内容:

  1. RabbitMQ与ActiveMQ有什么不同? RabbitMQ比ActiveMQ做得更好还是更差?
  2. 比较而言,RabbitMQconfiguration有多么简单/困难?
  3. RabbitMQ与Spring的整合程度如何?
    • 使用ActiveMQ,我只需将一个连接工厂Bean连接到一个JmsTemplate然后使用DefaultMessageListener bean将队列连接到它们各自的处理程序。 我可以用RabbitMQ做同样的事吗?
  1. RabbitMQ是AMQP代理,而ActiveMQ是JMS。 我build议您阅读AMQP维基百科文章,以了解AMQP中使用的概念,这些概念与您在JMS中熟悉的概念不同。 其中一个主要区别是,在AMQP中,生产者在不知道实际的消息分配策略的情况下发送到交换机,而在JMS中,生产者针对队列或主题(因此意识到消息路由的types)。 所以很难说什么好或者坏,因为JMS和AMQP之间的语义是非常不同的。

  2. RabbitMQ的队列和交换都是通过AMQP协议configuration的,所以客户端库允许您configuration所有目的地及其行为。 ActiveMQ需要特定的目标configuration,因为JMS规范不包括任何pipe理方面的事情。 除此之外,RabbitMQ的系统configuration是Erlangtypes的,而ActiveMQ通常是用XMLconfiguration的。 所以你必须习惯{tuple}和<>可爱的语法。 RabbitMQ 通常与OS软件包一起安装,而ActiveMQ发行版则是您放置在任何地方的归档文件(或Maven代码embedded到其他内容中)。

  3. 非常好:)参见Spring AMQP 。

AMQP是面向消息中间件(MOM)的应用级标准。 JMS是用于与MOM进行通信的Java的标准API。

使用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,那么他们都应该互相互操作。

ActiveMQ在他们的网站http://activemq.apache.org/amqp.html上说:“我们希望ActiveMQ能够在最终版本上实现最新版本,但是目前ActiveMQ并没有实现AMQP。; 现在AMQP 1.0已经出来了,ActiveMQ没有更多的时间支持它。

由于RabbitMQ是一个AMQP经纪人,其configuration主要通过AMQP本身处理,所以大部分问题都没有任何意义。

RabbitMQ的一个棘手的问题是许多操作系统软件包都在1.72,这是过时的。 你会做得更好,直接从他们的网站得到.deb或.rpm包的RabbitMQ 2.51。 之后,真正需要在AMQP之外完成的唯一configuration是使用rabbitmqctl创build虚拟主机和用户权限。 或者,您可以下载Webpipe理控制台的.ez插件,并在重新启动RabbitMQ之前将它们放在正确的目录中。 如果您使用的是2.51,则强烈build议您使用该Webpipe理控制台,但如果您坚持使用Debian和Ubuntu的默认值1.72,则无法使用该pipe理控制台。

一旦你运行了RabbitMQ,你可以使用任何语言和任何AMQP库。 我亲自接pipe了使用pika,amqplib和kombu的Python系统。 现在,我使用haigha和Scala的Java库,通过AMQP(当然还有MQ代理)互相通信。

比较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事务,可embeddedJava应用程序,可embeddedCamel。
  • 使用ActiveMQ进行Java自动化testing更容易(embedded式代理)