从ActiveMQ切换到RabbitMQ

sja*_*jac 50 activemq-classic amqp rabbitmq

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

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

Dav*_*sot 66

  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.


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

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


Mic*_*lon 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代理)相互交谈.