activemq - 为什么使用rabbitmq - 消息队列选型




从ActiveMQ切换到RabbitMQ (3)

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

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

  1. RabbitMQ是AMQP代理,而ActiveMQ是JMS代理。 我建议您阅读AMQP维基百科文章,以了解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


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,那么它们应该彼此互操作。

ActiveMQ在他们的网站activemq.apache.org/amqp.html说:“我们希望ActiveMQ在最终版本完成后能够实现最新版本。但是,目前,ActiveMQ还没有实现AMQP。” 现在AMQP 1.0已经淘汰,ActiveMQ没有关于他们什么时候支持它的消息。


由于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代理)相互交谈。